当前位置:网站首页>handler+message【消息机制】
handler+message【消息机制】
2022-07-30 04:10:00 【不良使】
作者 : 不良使
潜力创作新星 华为云享专家
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小知识
边栏推荐
- High Concurrency Framework Disruptor
- Mini Program Graduation Works WeChat Second-hand Trading Mini Program Graduation Design Finished Work (2) Mini Program Function
- Unity3D Application模拟进入前后台及暂停
- Eureka注册中心
- Solve the problem of compiling and installing gdb-10.1 unistd.h:663:3: error: #error “Please include config.h first.”
- Operational configuration: How to run multiple EasyCVR programs as a service in one server?
- [Driver] udev aliases each serial port of USB to 4 serial ports
- Mysql version upgrade, copy the Data file directly, the query is very slow
- Shell脚本基本编辑规范及变量
- Arrays and Structures
猜你喜欢
Mini Program Graduation Works WeChat Second-hand Trading Mini Program Graduation Design Finished Works (5) Task Book
sqlmap use tutorial Daquan command Daquan (graphics)
The difference between forward and redirect
高并发框架 Disruptor
[Switch] Protocol-Oriented Programming in Swift: Introduction
Go书籍大全-从初级到高级以及Web开发
vscode debugging and remote
Pytorch framework learning record 7 - convolutional layer
After 5 years of Ali internship interview~
逆向分析实战2
随机推荐
spicy (1) basic definition
Send it to your friends and let TA treat you to fried chicken!
Atomic Guarantees of Redis Distributed Locks
防抖与节流
Summary of Rpc and gRpc Introduction
WEB penetration of information collection
Eureka Registry
How to compare struct, slice, map for equality and the difference between several comparison methods in golang
OA Project Pending Meeting & History Meeting & All Meetings
Wechat second-hand transaction small program graduation design finished product (1) Development overview
Boss Rush (二分答案 + 状压DP)
Has been empty, a straightforward, continue to copy the top off!
函数的底层机制
The first day of Flink learning - what is batch and streaming computing?
forward与redirect的区别
【C进阶】数组传参与函数指针
Tcp programming
MySQL data query (subtotal and sorting)
SQL introduction of the first lecture -- MySQL 8.0.29 installation tutorial (Windows 64 - bit)
CMake installation and testing