Handle的详细用法

爱被打了一巴掌 2022-05-13 08:14 464阅读 0赞

Handler:是一个消息分发对象,进行发送和处理消息,并且其 Runnable 对象与一个线程的 MessageQueue 关联。

作用:调度消息,将一个任务切换到某个指定的线程中去执行。

为什么需要 Handler?

子线程不允许访问 UI

假若子线程允许访问 UI,则在多线程并发访问情况下,会使得 UI 控件处于不可预期的状态。

传统解决办法:加锁,但会使得UI访问逻辑变的复杂,其次降低 UI 访问的效率。

引入 Handler

采用单线程模型处理 UI 操作,通过 Handler 切换到 UI 线程,解决子线程中无法访问 UI 的问题。

Handler 使用

方式一: post(Runnable)

创建一个工作线程,实现 Runnable 接口,实现 run 方法,处理耗时操作。

创建一个 handler,通过 handler.post/postDelay,投递创建的 Runnable,在 run 方法中进行更新 UI 操作。

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. /**
  5. 耗时操作
  6. */
  7. handler.post(new Runnable() {
  8. @Override
  9. public void run() {
  10. /**
  11. 更新UI
  12. */
  13. }
  14. });
  15. }
  16. }).start();

方式二: sendMessage(Message)

创建一个工作线程,继承 Thread,重新 run 方法,处理耗时操作

创建一个 Message 对象,设置 what 标志及数据

通过 sendMessage 进行投递消息

创建一个handler,重写 handleMessage 方法,根据 msg.what 信息判断,接收对应的信息,再在这里更新 UI。

  1. private Handler handler = new Handler(){
  2. @Override
  3. public void handleMessage(Message msg) {
  4. super.handleMessage(msg);
  5. switch (msg.what) { //判断标志位
  6. case 1:
  7. /**
  8. 获取数据,更新UI
  9. */
  10. break;
  11. }
  12. }
  13. };
  14. public class WorkThread extends Thread {
  15. @Override
  16. public void run() {
  17. super.run();
  18. /**
  19. 耗时操作
  20. */
  21. //从全局池中返回一个message实例,避免多次创建message(如new Message)
  22. Message msg =Message.obtain();
  23. msg.obj = data;
  24. msg.what=1; //标志消息的标志
  25. handler.sendMessage(msg);
  26. }
  27. }
  28. new WorkThread().start();

发表评论

表情:
评论列表 (有 0 条评论,464人围观)

还没有评论,来说两句吧...

相关阅读

    相关 docker详细基础

    Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)。(我个人还是

    相关 map详细

    map的详细用法:       map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的

    相关 GIT详细

    1.初识GIT GIT:分布式版本控制系统 作用:源代码管理 好处:方便多人协同开发,方便版本控制 起源:辅助linux内核开发 现状:已经被微软收购 2.G

    相关 STL详细

    需要头文件 \include<algorithm> using namespace std;   这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二