默认情况下,Android中新创建的线程是没有开启消息循环的,但是主线程除外。系统会自动为主线程创建Looper对象,开启消息循环。
所以,当在主线程中应用下面的代码创建Handler对象不会出错,而如果在新创建的非主线程中应用下面的代码创建Handler对象,将产生异常信息。
Handler handler = new Handler();
异常信息
Can't create handler inside thread that has not called Looper.prepare().
因此我们在非主线程中创建Hnadler对象,首先需要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建该Looper对象,再使用Looper类的loop()方法启动Looper
,从消息队列中获取和处理消息。
public class LooperThread extends Thread
{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
//初始化Looper对象
Looper.prepare();
handler = new Handler()
{
public void handleMessage(Message msg)
{
Log.i("开始任务", "123");
}
};
msg = handler.obtainMessage(); //获取一个消息
msg.what = 0x11;
handler.sendMessage(msg);
Looper.loop(); //启动Looper
Log.i("线程退出", "123");
}
}
然后
LooperThread looperthread = new LooperThread();
LooperThread.start();
然而Looper.loop()之后的代码不会被执行,该函数内部是一个循环,当调用Handler.getLooper().quit()方法后,loop()方法才回终止,其后面的代码才能运行。