非主线程中使用Looper

主线程(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(); //开始处理消息
 }

 };


你可能感兴趣的:(非主线程中使用Looper)