主线程(UI线程)在启动时在其入口函数main中就进行了 Looper.prepare ..... Looper.loop 操作。因此不需要手动进行。
但是在非主线程中(一般是自己手动启动的线程) 则需要显示的调用Looper.prepare 和 Looper.loop . 然后才可以在线程中启用相应消息,调用Toast和Dialog或者通过handler相应消息, 原因是Toast和Dialog中都有handler, 需要通过当前线程的looper和当前线程交互。
loop是一个循环,其后的代码不能执行,所以loop一般放在run方法的最后。而prepare在run方法最开始处。
另外,网络请求必须放在非主线程中进行,否则报network in main thread exception。
Handler mHandler;
Runnable runnable = new Runnable() {
@Override
public void run() {
Looper.prepare();
...
// handler for other threads to send message
mHandler = new Handler(){
public void handleMessage(Message msg) {
// process incoming messages here
}
}
//这里的toast提示并不会马上显示,而是向run方法开头准备的looper消息队列发送消息
Toast.makeText(context "toast message" + res, Toast.LENGTH_SHORT).show();
...
Looper.loop(); //开始处理消息
}
};