- 在主线程中新建一个子线程进行耗时操作,但是子线程不可以改变 UI,所以在需要改变 UI 界面的时候就给 Handler 发送消息(如:更新已完成/更新进度),让 Handler 来通知主线程并改变 UI
- 当子线程需要跟主线程交流时,也就是当子线程要跟 UI 主线程说:亲,偶下载文件到80%了或者偶已经把文件下载完成了!执行这句代码
handler.sendEmptyMessage(1);//发送消息到handler,通知主线程下载完成
- 当发送空消息之后,在 Handler 将会收到子线程发来的消息,触发回调方法 handlerMessage(),我们就在这里对 UI 界面进行更新,这个回调方法是运行在 UI 主线程的, 但是如果你觉得每次都要重写 handlerMessage() 比较麻烦,我们完全可以用更加简略的方法来解决我们的需求,就是用 handler 中的 post 方法。代码如下
new Thread(){
@Override
public void run() {
// 在子线程中进行下载操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 发送消息到 handler,通知主线程下载完成
handler.post(new Runnable() {
@Override
public void run() {
text.setText("下载完成");
}
});
}
}.start();
- 如果你有时候连 handler 都不想搞,还可以只需要把 handler 换成 View 组件进行 post,更新任务自然会加载到 UI 主线程中进行处理。
// 发送消息到 handler,通知主线程下载完成
text.post(new Runnable() {
@Override
public void run() {
text.setText("下载完成");
}
});