在子线程中得到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方法就会在哪个线程执行。
网友评论