Android 中,一个线程对应一个Looper对象,一个Looper对象对应一个MessageQueue(消息队列),MessageQueue队列存放Message对象,存放的原则是先进先出。Looper对象用来开启一个消息循环。在默认的情况下,Android新建的线程是没有开启消息循环的,但是主线程除外。系统会自动为主线程创建Looper对象,在主线程中直接实例化Handler对象不会报错,但是在子线程中实例化就会报错。
会出现java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()的错误。那怎么才能在子线程中使用Handler呢?
首先要初始化Looper对象,然后就可以实例化Handler对象了,最后再启动Looper。
下面讲例子:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Handler handler1 = new Handler();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Looper.prepare();// 初始化消息对象
Handler handler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
Log.i("msg", String.valueOf(msg.arg1));// 打印出得到的消息
break;
}
super.handleMessage(msg);
}
};
Message msg = Message.obtain();
msg.what = 1;
msg.arg1 = 1234;
handler2.sendMessage(msg);// 发送消息
Looper.loop();// 启动消息
}
}).start();
}
}
在上面的例子中实例化了一个子线程,并且在子线程中实例化了Handler对象并且发送了一条消息。
下一篇讲Handler在Android应用,子线程和UI主线程的交互。