这里展示一个Demo,具体实现了一个ProgressBar通过新建的线程完成一系列的操作,并实时更新UI界面。
package com.example.handler;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private ProgressBar progressBar;
private final int MESSAGE_0 = 1;
public int prog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("handler", "MainActivity Thread id = " + Thread.currentThread().getId());
setView();
/*当使用
handler.post(new Runnable);
时Handler和Activity处于同一个线程当中,在同一个线程中调用run方法。
使用Handler的post方法将Runnable对象放到Handler的线程队列中后,该Runnable的执行其实并未单独开启线程,
而是仍然在当前Activity线程中执行的,Handler只是调用了Runnable对象的run方法。
而使用
Thread t = new Thread(new Runnable());
t.start();
创建的线程和Activity处于不同的线程中*/
new Thread(new MyThread()).start();
}
private void setView() {
// TODO Auto-generated method stub
progressBar = (ProgressBar)findViewById(R.id.progressBar1);
progressBar.setMax(100);
}
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case MESSAGE_0:
prog = msg.arg1;
progressBar.setProgress(prog + 1);
break;
default:
break;
}
};
};
public class MyThread implements Runnable{
//在新线程中处理数据,并把数据包装成Message发送给主线程的handler做UI处理等
@Override
public void run() {
//
Log.i("handler", "MyThread id = " + Thread.currentThread().getId());
for(int i=0;i<100;i++){
/*
* 用obtainMessage获取的Message开销要比每次创建一个Msg对象要小
* 此方法是从Message Pool中提取的,省略了New一个Message的开销
* 尤其是在这种循环之中
*/
Message message = handler.obtainMessage();
message.arg1 = i;
message.what = MESSAGE_0;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendMessage(message);
}
}
}
}
代码中的大部分要点已经注释出来了,不再需要过多的解释了,请大家细细体会。
此Demo可以作为Handler异步消息处理并更新UI界面的模板。
这篇文章实现了Thread向主UI线程发送消息(sendMessage),消息的处理(handlerMessage)依然是在主UI线程中。下一章会实现一个绑定新Looper的Handler,并在新进程中处理发送过来的数据(handlerMessage)。