Android多线程UI更新-Handler
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相关推荐
- WPF多线程UI更新——两种方法
WPF多线程UI更新--两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...
- Android多线程界面更新方法的总结
Android多线程与界面交互的方法 Activity.runOnUiThread(Runnable) View.post(Runnable),View.postDelay(Runnable,long ...
- WPF多线程UI更新
前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对象.)这是很常见的一个错误,一不小 ...
- Android多线程编程(异步通信)---Handler和AsyncTask
Handler机制: 1)主线程UI: 本身就有一个Looper机制,其中有Handler,中包含了消息队列MessageQueen: 2)UI线程模型: UI主线程不允许其他线程操作组件,只有UI主 ...
- Androidの多线程之更新ui(Thread+Handler+Message)
流程: 1.点击开始,显示进度对话框,启动线程,循环发送消息(1-100) 2.更新对话框中的进度,和标题栏的进度 3.到达最大进度值时,关闭对话框,标题栏显示更新完成 解析: 1.在主线程处理han ...
- Androidの多线程之更新ui(AsyncTask)
AsyncTask 构造(泛型参数) 外部步骤: AsyncTask task = new AsyncTask<params,values,result>(); task.exec(par ...
- Android多线程:深入分析 Handler机制源码(二)
前言 在Android开发的多线程应用场景中,Handler机制十分常用 接下来,深入分析 Handler机制的源码,希望加深理解 目录 1. Handler 机制简介 定义 一套 Android 消 ...
- Android 系统性能优化(45)---Android 多线程
前言 Android 开发中多线程的必要性 理解 Android 多线程 MessageQueue Looper Handler HandlerThread Android 中为什么只允许在主线程更新 ...
- Android 为什么要有handler机制?handler机制的原理
为什么要有handler机制? 在Android的UI开发中,我们经常会使用Handler来控制主UI程序的界面变化.有关Handler的作用,我们总结为:与其他线程协同工作,接收其他线程的消息并通过 ...
最新文章
- ICCV2021 | SMCA:即插即用的共同注意力模型,可使DETR收敛加速10倍
- 【alibaba-cloud】网关整合sentinel实现限流
- paper每日谈——动机
- 怎么用java ee编程_Java EE应用程序入门 - 编程入门网
- 发哥推荐的linux网站,记录一下
- 配电脑时什么配置可以缩水?
- 地籍图 cad cass 二次开发 过滤器过滤扩展数据组码1000的解决方案
- CreatePipe()函数
- Hexo next主题修改背景报 failed to locate @import file F:\blog\source\_data\styles.styl
- python爬取网易云飙升榜数据
- CC2530 zigbee IAR8.10.1环境搭建
- 如何拿下头条号原创标?这里有份6000字的指南
- c4d-造型工具-6
- bootstrap使用及解析
- 无线通信接收机系统常规指标之----噪声系数和灵敏度
- html修改当前窗口大小,设置HTML页面和浏览器窗口的大小
- mysql根据id分页_MySQL_MSSQL根据ID进行分页实现方法,复制代码 代码如下: ALTER PROCEDU - phpStudy...
- struts中的moderldriven
- 科技爱好者周刊(第 134 期):未来的游戏业比现在大100倍
- JAVA学习练习(扎金花与21点)
热门文章
- 最近开始研究PMD(一款采用BSD协议发布的Java程序代码检查工具)
- Kali Linux Web渗透测试手册(第二版) - 1.3 - 靶机的安装
- 机器学习系列(2)——CART算法
- ISO 16750.1-2006道路车辆电子电气部件的环境试验 第一部分
- 2021年全球与中国重型卡车行业市场规模及发展前景分析
- 记录:关于“扫雷”的布雷招
- 路由器重温——ADSL/VDSL接口配置管理
- ant design pro of vue导航菜单图标引入阿里巴巴矢量库iconfont方法
- 作为一个新手程序员该如何成长?http://www.codeceo.com/article/how-new-programmer-grow.html#0-tsina-1-19469-397232819
- 研究生新生培训第二周:卷积神经网络基础