android实现线程间通信的四种常见方式
作者:流星雨在线 时间:2022-08-20 13:11:17
1,通过Handler机制
主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用。 另外Handler机制与Activity生命周期不一致的原因,容易导致内存泄漏,不推荐使用。
private void one() {
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 123:
tv.setText(""+msg.obj);
break;
}
}
};
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message=new Message();
message.what=123;
message.obj="通过Handler机制";
handler.sendMessage(message);
}
}.run();
}
2,runOnUiThread方法
private void two(){
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText("通过runOnUiThread方法");
}
});
}
}.run();
}
用Activity对象的runOnUiThread方法更新,在子线程中通过runOnUiThread()方法更新UI,强烈推荐使用。
3,View.post(Runnable r) 、
private void three(){
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
tv.post(new Runnable() {
@Override
public void run() {
tv.setText("通过View.post(Runnable r) 方法");
}
});
}
}.run();
}
这种方法更简单,但需要传递要更新的View过去,推荐使用
4,AsyncTask
private void four(){
new MyAsyncTask().execute("通过AsyncTask方法");
}
private class MyAsyncTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return objects[0].toString();
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
tv.setText(o.toString());
}
}
来源:https://blog.csdn.net/liuxingyuzaixian/article/details/78893392
标签:android,线程,通信
0
投稿
猜你喜欢
浅谈Spring-cloud 之 sleuth 服务链路跟踪
2022-09-24 16:07:43
C#中数组、ArrayList和List三者的区别详解及实例
2023-11-07 03:12:47
java中的String定义的字面量最大长度是多少
2023-09-01 08:35:31
详解在spring boot中消息推送系统设计与实现
2023-05-28 04:17:00
C# DataTable中查询指定字段名称的数据
2023-10-08 16:16:44
java微信公众号开发第一步 公众号接入和access_token管理
2022-04-21 23:06:41
解决logback的日志文件路径问题
2023-06-13 10:48:09
深入了解java.util.Arrays的使用技巧
2023-01-10 18:01:32
Unity中的PostProcessScene实用案例深入解析
2021-06-09 04:57:28
Android开发Jetpack Compose元素Modifier特性详解
2023-03-10 23:29:54
springboot 中整合mybatis多数据源不使用JPA
2023-03-01 08:43:02
SpringBoot利用jackson格式化时间的三种方法
2022-03-26 22:28:56
在IDEA中 实现给main方法附带参数的操作
2022-10-23 14:42:03
教你用Java在个人电脑上实现微信扫码支付
2023-07-22 20:52:15
SpringMVC如何用Post方式重定向
2021-10-05 21:34:27
基于android studio的layout的xml文件的创建方式
2022-10-31 10:52:06
代码分析Android实现侧滑菜单
2022-04-02 16:38:45
Kafka Producer中的消息缓存模型图解详解
2022-05-03 06:00:13
SpringBoot+easypoi实现数据的Excel导出
2023-04-05 12:27:19
Java实现一个简易聊天室流程
2023-10-02 19:55:53