java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

a0cfc3fe83afeabadddf3fc1653c6382.png

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.lixyz.handlertest;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;public class MainActivity extendsActivity {privateButton button;privateHandler handler;private int i = 0;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button=(Button) findViewById(R.id.button);

button.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

Log.d("TTTT", "onClick:" +Thread.currentThread().getName());

Message msg=handler.obtainMessage();

handler.sendMessage(msg);

}

});

WorkerThread wt= newWorkerThread();

wt.start();

}class WorkerThread extendsThread {

@Overridepublic voidrun() {super.run();

handler= newHandler() {

@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);

Log.d("TTTT", "收到了消息对象");

}

};

}

}

}

MainActivity.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

activity_main.xml

上面的问题貌似没什么错误,但运行时却出错

65599141301ee3fc0e7dd478b75fb9ec.png

抛出异常:

09-17 04:01:31.655 15854-15869/? E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-120

Process: cn.lixyz.handlertest, PID: 15854

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

at android.os.Handler.(Handler.java:200)

at android.os.Handler.(Handler.java:114)

at cn.lixyz.handlertest.MainActivity$WorkerThread$1.(MainActivity.java:48)

at cn.lixyz.handlertest.MainActivity$WorkerThread.run(MainActivity.java:48)

提示我们没有调用Looper.prepare(),无法创建线程,原因是非主线程中默认是没有创建Looper对象的,需要先调用Looper.prepare()启用Looper。修改一下上面的代码。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecn.lixyz.handlertest;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Looper;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;public class MainActivity extendsActivity {privateButton button;privateHandler handler;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button=(Button) findViewById(R.id.button);

button.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

Message msg=handler.obtainMessage();

msg.what= 100;

handler.sendMessage(msg);

Log.d("TTTT", "sendMessage:" +Thread.currentThread().getName());

}

});

WorkerThread wt= newWorkerThread();

wt.start();

}class WorkerThread extendsThread {

@Overridepublic voidrun() {super.run();

Looper.prepare();

handler= newHandler() {

@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);

Log.d("TTTT", "handleMessage:" +Thread.currentThread().getName());int i =msg.what;

Log.d("TTTT", "收到了消息对象:" +i);

}

};

Looper.loop();

}

}

}

MainActivity.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

activity_main.xml

运行结果:

09-17 04:29:48.669 28397-28397/cn.lixyz.handlertest D/TTTT﹕ sendMessage:main09-17 04:29:48.669 28397-28410/cn.lixyz.handlertest D/TTTT﹕ handleMessage:Thread-141

09-17 04:29:48.669 28397-28410/cn.lixyz.handlertest D/TTTT﹕ 收到了消息对象:100

上面代码表示,消息是从MainThread发送的,WorkerThread接收到了消息。

PS:非UI线程默认是没有创建Looper对象的,所以需要主线程向子线程传递消息时,需创建Looper对象并启动循环,子线程才可以循环着从MaessageQueue中取出消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开源笔记软件下载_开发常用软件笔记 - ZhaoQian's Blog - OSCHINA - 中文开源技术交流社区...

notepad使用快捷键CtrlH打开“替换对话框”,在每行的开头添加内容。 勾选左下角的“正则表达式”选项 在“查找目标”里输入上尖号“^”,上尖号代表每行的开头 在“替换为”里输入“private String”。然后点"全部替换"按钮,这样每…

极光推送指定用户推送_App用户都睡着了?是时候用推送和活动唤醒一波了!

想要运营好一款App,引流、留存、促活三大环节必不可少。引流解决了用户来的问题,留存解决了用户留下来的问题,而促活解决的是让一部分新注册用户以及许久没有动静的老用户,在平台中再次活跃起来。今天,我们就来聊聊关于…

oracle awr报告生成_分享AWR报告的生成和简单分析方法

生成AWR报告方法:第一步:数据库压力测试卡开始时:生成第一个快照:Sql>exec dbms_workload_repository.create_snapshot();第二步:数据库压力测试结束时:生成第二个快照Sql>exec dbms_workload_reposi…

安卓开发 登录用户信息缓存_在Linux上使用finger命令查询登录用户信息

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要讲解finger命令的作用和日常使用案例。finger命令是一个用户信息查询命令,它给出了所有登录用户的详细信息。…

POJ 1065 Wooden Sticks

http://blog.csdn.net/acdreamers/article/details/7626671 学习一下Dilworth定理 推荐一篇写得很好博客 要求最少的覆盖&#xff0c;按照Dilworth定理 最少链划分 最长反链长度 所以最少系统 最长导弹高度上升序列长度。 之前写的LIS模板不对。。。。。。 1 #include<cst…

python 对象_Python小课堂面向对象

Python3 面向对象Python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。如果你以前没有接触过面向对象的编程语言&#xff0c;那你可能需要先了解一些面向对象语言…

使用jemalloc优化java_Jemalloc优化MySQL和Nginx

Redis 2.4版本之后&#xff0c;默认使用jemalloc来做内存管理&#xff1b;tengine也整合jemalloc。jemalloc从各方评测的结果可见与google tcmalloc都不相伯仲&#xff0c;皆为内存管理器领域最高水平。如下图&#xff1a;最左边的就是glibc的malloc&#xff0c;最右边的就是je…

【代码升级】【iCore3 双核心板】例程二十八:FSMC实验——读写FPGA

实验指导书及代码包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1i6WL51V 密码&#xff1a;1mk4 iCore3 购买链接&#xff1a; https://item.taobao.com/item.htm?id524229438677 转载于:https://www.cnblogs.com/xiaomagee/p/5409024.html

sqlserver连接字符串_【自学C#】|| 笔记 39 SQL server 连接数据库

一、ADO.NET数据库操作 任何一个应用程序都离不开数据的存储&#xff0c;数据可以在内存中存储&#xff0c;但只能在程序运行时存取&#xff0c;无法持久保存。数据还可以在磁盘中以文件的形式存储&#xff0c;但文件的管理和查找又十分烦琐无法胜任大数量的存储。将数据存储…

Android Studio、 补充知识以及主要组件

转载于:https://www.cnblogs.com/arxk/p/5410597.html

using(){},Close(),Dispose()的区别

//用Close(),Dispose()方式关闭连接 string connString "Data Source(local);Initial CatalogLinq;Integrated SecuritySSPI"; SqlConnection conn new SqlConnection(connString); conn.Open(); conn.Close(); conn.Dispose();//用using方式关闭连接 string connS…

一个域名解析到另一个域名_注册域名公司|教你如何注册一个.net域名

近几年各后缀域名注册量都在增加&#xff0c;很多行业知道线上业务平台搭建的重要性&#xff0c;都优先制作网站布局线上&#xff0c;建站肯定需要域名&#xff0c;所以这也是带动域名注册量上涨原因之一。.COM、.NET域名一直是建站注册域名首选&#xff0c;.COM域名大家可能相…

java jedis connect timed out_Java连接Redis connection timed out 报错的解决方法

Java连接Redis connection timed out 报错的解决方法踩坑场景在使用 RedisTemplate 连接 Redis 进行操作的时候&#xff0c;发生了如下报错&#xff1a;报错信息如下&#xff1a;Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.73.10:6…

富文本存储型XSS的模糊测试之道

富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据&#xff0c;我们足以管中窥豹&#xff0c;跨站脚本漏洞&#xff08;Cross-site Script&#xff09;仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大敌”。 XSS可以粗分为反射型XSS和存储型…

phpstorm xdebug配置

phpstorm 8.0.3版本 1.本身自带xdebug插件 2.在xampp的php.ini中最后中添加&#xff08;如果有[XDebug]配置替换&#xff09; [XDebug]zend_extension "D:\Program Files\xampp\php\ext\php_xdebug.dll";xdebug.profiler_append 0;xdebug.profiler_enable 1;xdebu…

springmvc+ztree v3实现类似表单回显功能

在做权限管理系统时&#xff0c;可能会用到插件zTree v3,这是一个功能丰富强大的前端插件&#xff0c;应用很广泛&#xff0c;如异步加载菜单制作、下拉选择、权限分配等。在集成SpringMVC中&#xff0c;我分别实现了zTree的添删改查&#xff0c;本节主要实现类似表单回显功能。…

Android应用安全开发之浅谈网页打开APP

一、网页打开APP简介 Android有一个特性&#xff0c;可以通过点击网页内的某个链接打开APP&#xff0c;或者在其他APP中通过点击某个链接打开另外一个APP&#xff08;AppLink&#xff09;&#xff0c;一些用户量比较大的APP&#xff0c;已经通过发布其AppLink SDK&#xff0c;开…

php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...

发布图片最多可添加9张作品发布wx.config({debug: false,appId: {$signPackage["appid"]},timestamp: {$signPackage["timestamp"]},nonceStr: {$signPackage["noncestr"]},signature: {$signPackage["signature"]},jsApiList: [// 所…

vue防抖和节流是什么_JavaScript防抖与节流,你知道多少?

JavaScript 的节流和防抖已经是老生畅谈的问题了&#xff0c;对于前端行业技术大牛来讲不过是小菜一碟&#xff0c;而对于绝大多数前端小白或初级工程师&#xff0c;绝对是必备的知识&#xff0c;值得学习。接下来小郭就带大家一起学习“防抖”与“节流”。防抖不知道大家第一次…

php中循环跳过,php for循环的exit / break / continue /goto 停止、跳过循环、继续循环...

php 与 JavaScript 有很多相似的地方&#xff1b; for循环中也有两个相同&#xff1b; 只是 php 比 js 多了一个 exit &#xff0c; 其他用法一样&#xff1b;for($i 1;$i<11;$i){if($i3){// exit; //当$i 3 代码停止运行&#xff0c;包括循环外的&#xff0c;后面的也停止运…