版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21700489/article/details/78717942
Google官方文档介绍:
Handler允许你发送和处理与某个线程相关联的Message和Runnable对象。每一个Handler实例与单个线程以及该线程唯一的MessageQueue相关联。在哪个线程中建立Hander对象,该Handler对象自动会绑定到哪个线程中,并且同时与该线程的MessageQueue和Looper建立起关联关系。从那时起,Handler将会向消息队列MessageQueue传递Message或Runnable对象,并且在他们从消息队列中出来的时候执行它们。
Handler的两个主要用途:
- 安排Message和Runnable在将来的某个时间点运行
- 将action入队以便在一个不同的线程中运行(即能够实现线程之间的通信。比如说当你创建一个子线程后,可以在该子线程中获取父线程中创建的Hander对象,就能通过该对象向父线程的消息队列发送消息了。)
注意事项
- 在子线程(即非UI线程)初始化Handler首先要执行
Looper.prepare();
子线程更新UI实例
步骤:
- 在UI主线程中创建Handler对象
- 构建Runnable对象。在Runnable中编写更新UI的相关代码
- 在子线程的run方法中向UI线程post runnable对象来更新UI
public class MainActivity extends BaseActivity{
private Handler mHandler;
private String data;
public void onCreate(Bundle savaInstanceState){
mHandler=new Handler();
...//省略
view.setOnClickListener(view ->{
//开启一个后台线程处理耗时的操作
new Thread(()->{
final DownFiles df=new DownFiles("http:....");
data = df.downLoadFiles();
//在A线程中用B线程的Hander对象发送Message或者Runnable对象
//会在A线程中接受和处理Message或者Runnable对象
handler.post(()->{ view.setText(data)});
}).start();
});
}
}
注意:以上代码片段为了看起来更简洁使用了Lambda表达式