文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

handler+message【消息机制】

2023-09-18 08:11

关注

🍖🍖 作者 : 不良使
🍖🍖🍖🍖 潜力创作新星 华为云享专家
🍖🍖🍖🍖🍖 Python+Android
🍖🍖🍖🍖🍖🍖 博客记录学习的思路,项目和错误,寻找志同道合的朋友
🍖🍖🍖🍖🍖🍖🍖 如果觉得有帮助记得一键三连 ┗|`O′|┛ 嗷~~


在这里插入图片描述

🍎🍎引言

handler 主要是解决同一个页面的耗时操作。在看方法之前看一下Android中消息机制耗时操作一般不在主线程里面进行,因为可能会造成堵塞,加载慢,程序崩溃等。在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法。解决主线程无法完成耗时的操作有很多。

🥭🥭1、Handler(消息机制)
🥭🥭2、runOnUiThread(在子线程中new一个主线程)
🥭🥭3、Looper


这篇文章讲解Handler(消息机制)

🍎🍎handler实现

handler处理子线程无法进行耗时操作的方法就 等价于 将耗时操作通过任务的方式分配给别人,子线程中就执行了分配任务的操作(非耗时操作)。举个例子吧,大公司做一个大项目需要很长时间,但是分配给子公司就不需要干这个耗时的操作。只需要执行把任务分配给子公司,子公司做完后验收项目即可。等价于将独立完成大项目到最后只需要分配任务和审核项目操作。

🌹🌹🌹🌹🌹🌹🌹创建处理者和消息,发送数据。

Handler handler=new Handler();Message message=new Message();message.what=111;message.obj=数据;//数据可以是基本类型、对象、列表、数组等handler.sendMessage(message);


🍓🍓🍓🍓下面对handler中一些名词及相关进行解析。🍓🍓🍓🍓

Handler handler=new Handler();
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。new Handler()相当于创建一个处理着。

Message message=new Message();
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。new Message()相当于创建一个Message对象,存储数据为后面数据发送(任务分配)做准备

说到消息message,怎么能忘掉消息队列呢?
💕💕MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。looper下面会说

message.what=111;
这个相当于View.OnClickListener重写方法onClick(View v)的v.getId(),都是整型
在这里插入图片描述
下面会有使用这个,但是建议写死在一个类里面,便于项目管理。

message.obj=数据;//数据可以是基本类型、对象、列表、数组等
这句代码是正真的核心,相当于把赋值给这个message(消息对象),此时的数据类型可以是数据可以是基本类型、对象、列表、数组等

handler.sendMessage(message);
发送消息,将消息发送出去。



🌹🌹🌹🌹🌹🌹🌹重写handleMessage方法,接收数据,执行耗时操作。

@Override    public boolean handleMessage(@NonNull Message msg) {        switch (msg.what){            case 111:                Toast.makeText(LoginMainActivity.this, "登陆失败" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();                break;            default:                break;        }        return false;    }

上面的handler发送消息可以根据 message.what=111; 发送不同的数据,handleMessage可以通过switch~case 区分出来。

handler有两种方法实现,原理都一样,一个直接new,一个调用接口。两种方式可根据项目自己选择。上面说的是第一种方法,但是原理是一样的,下面总结一下

🍓🍓第一种,接口implements

在这里插入图片描述


发送数据

Handler handler=new Handler();Message message=new Message();message.what=111;message.obj=数据;//数据可以是基本类型、对象、列表、数组等handler.sendMessage(message);

接收数据,执行耗时操作

@Override    public boolean handleMessage(@NonNull Message msg) {        switch (msg.what){            case 111:                Toast.makeText(LoginMainActivity.this, "登陆失败" + mEtPassWord.getText().toString().trim(), Toast.LENGTH_SHORT).show();                break;            default:                break;        }        return false;    }


🍓🍓第二种,new个

子线程发送数据

private void updateWeather() {          new Thread(new Runnable(){              @Override              public void run() {                  //耗时操作,完成之后发送消息给Handler,完成UI更新;                  mHandler.sendEmptyMessage(0);                  //传递数据                Message msg =new Message();                  msg.obj = "数据";//数据可以是基本类型、对象、列表、数组等                  mHandler.sendMessage(msg);              }          }).start();      }  

主线程接收数据

Handler mHandler = new Handler() {            @Override          public void handleMessage(Message msg) {              super.handleMessage(msg);              switch (msg.what) {              case 0:                  //拿到数据,执行耗时操作                 String data = (String)msg.obj;                  updateWeather();                  textView.setText(data);                  break;              case 1:            ......            break;            ...            default:                  break;              }          }        };  

🥭🥭2、runOnUiThread(在子线程中new一个主线程)
🥭🥭3、Looper
见下一篇文章


嗯~~,看的不尽兴。*

在刷题之前先介绍一下牛客。Leetcode有的刷题牛客都有,除此之外牛客里面还有招聘(社招和校招)、一些上岸大厂的大佬的面试经验。 牛客是可以伴随一生的编程软件(完全免费),从学校到社会工作,时时刻刻你都可以用到感兴趣的可以去注册试试可以伴随一生的刷题app








觉得有用的可以给个三连,关注一波!!!带你了解更多的Android小知识

来源地址:https://blog.csdn.net/qq_46906413/article/details/125663010

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯