回顾一下我们之前的 开启一个线程Thread并用进度条显示进度 小节,提到了这么一个东西:不允许在 WorkerThread 中去修改 UI,要修改 UI 只能通过在 WorkerThread 中用 Handler 将数据发送到消息队列中,然后在主线程用 Looper(就是在主线程中实例化 Handler) 将数据从消息队列中取出,才能修改 UI。
那么,我们现在再来看看这么一个例子,会颠覆之前的看法:
private Button btn_rand;
private TextView rtv;
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.random);
btn_rand = (Button)findViewById(R.id.btn_rand_r);
rtv = (TextView)findViewById(R.id.rtv);
btn_rand.setOnClickListener(new ButtonListener());
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if( v.getId() == R.id.btn_rand_r){
Thread rt = new RandomThread();
rt.start();
}
}
}
class RandomThread extends Thread{
@Override
public void run(){
Runnable r = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
String s = "我是从 Runnable 来的";
rtv.setText(s);
}
};
handler.post(r);
}
}
运行App,结果如下:
点击按钮,TextView的文字马上改变了。什么?竟然能在 Worker Thread 直接修改 UI?太厉害了吧。
具体有关 Runnable 的东西现在还不谈,有兴趣可以先到网上搜一下相关资料。