Handler

处理程序允许您发送和处理Message与线程关联的可运行对象MessageQueue。每个 Handler 实例都与单个线程和该线程的消息队列相关联。当你创建一个新的 Handler 时,它被绑定到一个Looper. 它将消息和runnables 传递到该Looper 的消息队列并在该Looper 的线程上执行它们。

Handler 有两个主要用途:(1)安排消息和可运行文件在未来某个时间点执行;(2) 将要在与您自己的线程不同的线程上执行的操作排入队列。

调度消息是通过 post(Runnable)、postAtTime(java.lang.Runnable, long)、 postDelayed(Runnable, Object, long)、sendEmptyMessage(int)、 sendMessage(Message)、sendMessageAtTime(Message, long)和 sendMessageDelayed(Message, long)方法完成的。post版本允许您将Runnable 对象排入队列,以便在收到消息队列时调用它们;sendMessage版本允许您将包含一组数据的对象排入队列,Message这些数据将由 Handler 的handleMessage(Message)方法处理(要求您实现 Handler 的子类)。

当发布或发送到处理程序时,您可以允许在消息队列准备好后立即处理项目,或者指定处理之前的延迟或处理它的绝对时间。后两者允许您实现超时、滴答声和其他基于时间的行为。

当为您的应用程序创建一个进程时,它的主线程专用于运行一个消息队列,该队列负责管理顶级应用程序对象(活动、广播接收器等)以及它们创建的任何窗口。您可以创建自己的线程,并通过 Handler 与主应用程序线程进行通信。这是通过调用与以前相同的 post或sendMessage方法来完成的,但来自您的新线程。然后,给定的 Runnable 或 Message 将被安排在 Handler 的消息队列中,并在适当的时候进行处理。

场景

在安卓开发中,经常会遇到耗时操作,在主线程中无法完成的动作,这时候需要用到多线程来帮我们做这些耗时的操作,但是多线程无法更新UI(TextView的setText等都是更新UI)。此时需要配合Handle来完成UI界面的更新。

用法

比如说从文件中读取Bitmap文件

new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = BitmapFactory.decodeFile("Your path");}
}).start();

此时如果我们要把解析的bitmap设置成ImageView的背景

binding.imageView.setImageBitmap(bitmap);

如果对bitmap做一些旋转平移等操作,则可能会报错

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

此时我们需要用Handle来处理更新UI的操作

private final Handler.Callback callback = new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {return false;}
};
private final Handler handler = new Handler(Looper.getMainLooper(), callback);@Override
public void onDestroy() {super.onDestroy();handler.removeCallbacksAndMessages(callback);//退出Activity时释放handle消息处理,否则可能会造成卡顿,内存泄露等问题
}

Handle对象的创建如上。

在多线程中完成数据处理操作之后,需要用用handle发送消息来通知callback更新

new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = BitmapFactory.decodeFile("Your Path");Message message = new Message();message.what = 99;//这里99无特殊意义,自定义就行message.obj = bitmap;handler.sendMessage(message);}
}).start();private final Handler.Callback callback = new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {if (msg.what == 99) {binding.imageView.setImageBitmap((Bitmap) msg.obj);}return false;}
};

如果是多线程为自定义类

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;public class DemoThread extends Thread{private Handler handler;private String path;public DemoThread(Handler handler, String path) {this.handler = handler;this.path = path;}@Overridepublic void run() {super.run();Bitmap bitmap = BitmapFactory.decodeFile(path);Message message = new Message();message.what = 99;message.obj = bitmap;handler.sendMessage(message);}
}
DemoThread demoThread = new DemoThread(handler, file.getAbsolutePath() + "/" + uri);
demoThread.start();

Android多线程UI更新-Handler相关推荐

  1. WPF多线程UI更新——两种方法

    WPF多线程UI更新--两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  2. Android多线程界面更新方法的总结

    Android多线程与界面交互的方法 Activity.runOnUiThread(Runnable) View.post(Runnable),View.postDelay(Runnable,long ...

  3. WPF多线程UI更新

    前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对象.)这是很常见的一个错误,一不小 ...

  4. Android多线程编程(异步通信)---Handler和AsyncTask

    Handler机制: 1)主线程UI: 本身就有一个Looper机制,其中有Handler,中包含了消息队列MessageQueen: 2)UI线程模型: UI主线程不允许其他线程操作组件,只有UI主 ...

  5. Androidの多线程之更新ui(Thread+Handler+Message)

    流程: 1.点击开始,显示进度对话框,启动线程,循环发送消息(1-100) 2.更新对话框中的进度,和标题栏的进度 3.到达最大进度值时,关闭对话框,标题栏显示更新完成 解析: 1.在主线程处理han ...

  6. Androidの多线程之更新ui(AsyncTask)

    AsyncTask 构造(泛型参数) 外部步骤: AsyncTask task = new AsyncTask<params,values,result>(); task.exec(par ...

  7. Android多线程:深入分析 Handler机制源码(二)

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义 一套 Android 消 ...

  8. Android 系统性能优化(45)---Android 多线程

    前言 Android 开发中多线程的必要性 理解 Android 多线程 MessageQueue Looper Handler HandlerThread Android 中为什么只允许在主线程更新 ...

  9. Android 为什么要有handler机制?handler机制的原理

    为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...

最新文章

  1. ICCV2021 | SMCA:即插即用的共同注意力模型,可使DETR收敛加速10倍
  2. 【alibaba-cloud】网关整合sentinel实现限流
  3. paper每日谈——动机
  4. 怎么用java ee编程_Java EE应用程序入门 - 编程入门网
  5. 发哥推荐的linux网站,记录一下
  6. 配电脑时什么配置可以缩水?
  7. 地籍图 cad cass 二次开发 过滤器过滤扩展数据组码1000的解决方案
  8. CreatePipe()函数
  9. Hexo next主题修改背景报 failed to locate @import file F:\blog\source\_data\styles.styl
  10. python爬取网易云飙升榜数据
  11. CC2530 zigbee IAR8.10.1环境搭建
  12. 如何拿下头条号原创标?这里有份6000字的指南
  13. c4d-造型工具-6
  14. bootstrap使用及解析
  15. 无线通信接收机系统常规指标之----噪声系数和灵敏度
  16. html修改当前窗口大小,设置HTML页面和浏览器窗口的大小
  17. mysql根据id分页_MySQL_MSSQL根据ID进行分页实现方法,复制代码 代码如下: ALTER PROCEDU - phpStudy...
  18. struts中的moderldriven
  19. 科技爱好者周刊(第 134 期):未来的游戏业比现在大100倍
  20. JAVA学习练习(扎金花与21点)

热门文章

  1. 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)
  2. Kali Linux Web渗透测试手册(第二版) - 1.3 - 靶机的安装
  3. 机器学习系列(2)——CART算法
  4. ISO 16750.1-2006道路车辆电子电气部件的环境试验 第一部分
  5. 2021年全球与中国重型卡车行业市场规模及发展前景分析
  6. 记录:关于“扫雷”的布雷招
  7. 路由器重温——ADSL/VDSL接口配置管理
  8. ant design pro of vue导航菜单图标引入阿里巴巴矢量库iconfont方法
  9. 作为一个新手程序员该如何成长?http://www.codeceo.com/article/how-new-programmer-grow.html#0-tsina-1-19469-397232819
  10. 研究生新生培训第二周:卷积神经网络基础