handler post 线程

2019-12-30  本文已影响0人  couriravant

在子线程中得到UI线程的handler对象

了解handler机制的小伙伴都知道,handler对象是哪个线程的它的post方法参数Runnable的run方法就执行在哪个线程(源码里直接调用了run方法)。所以我们要是可以在子线程中得到UI线程的handler对象就可以更方便的实现线程间的通信。示例代码如下:

new Thread(new Runnable() {
     @Override
     public void run() {
         Handler handler = new Handler(Looper.getMainLooper());//得到UI线程中的handler对象
         handler.post(new Runnable() {
            @Override
             public void run() {
                //这儿写逻辑代码
             }
         });
     }
 }).start();

注:使用这种方法可以轻松的从子线程跳转到UI线程,完全不依赖于Activity或Application。图片加载框架Picasso,网络请求控件Volley都是通过这种方法实现更新UI的。

在主线程中得到子线程的handler对象

// 1. 创建 HandlerThread 并准备 Looper
handlerThread = new HandlerThread("myHandlerThread");
handlerThread.start();

// 2. 创建 Handler 并绑定 handlerThread 的 Looper
new Handler(handlerThread.getLooper()).post(new Runnable() {
    @Override 
    public void run() {
          // 注意:Handler 绑定了子线程的 Looper,这个方法也会运行在子线程,不可以更新 UI
          MLog.i("Handler in " + Thread.currentThread().getName());
    }
});

也就是说,handler跟哪个线程的looper绑定了,post中Runnable的run方法就会在哪个线程执行。

上一篇 下一篇

猜你喜欢

热点阅读