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”。然后点"全部替换"按钮,这样每…

python示例apk_Python获取apk文件URL地址实例

工作中经常需要提取apk文件的特定URL地址,如是想到用Python脚本进行自动处理。需要用到的Python基础知识如下:os.walk()函数声明:os.walk(top,topdownTrue,οnerrοrNone)(1)参数top表示需要遍历的顶级目录的路径。(2)参数topdown的默认值是“True”表示…

使用静态工厂方法而不是构造器

注意:静态工厂方法不是设计模式中的工厂方法。 一个类向客户端提供静态工厂方法有如下好处: 有名称,不用根据参数类型和顺序区分重载方法,让代码更易读 是否每次调用都需要新对象是可控制的,对于不可修改的对象可以采取…

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

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

扫描sdcard文件(递归)

private void saoMiaoSdCard() {// TODO Auto-generated method stub// 判断是否挂载if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {// 获取sdcardFile sdcard Environment.getExternalStorageDirectory();// 创建集合对象list_file new A…

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

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

java date.from_java datefromat

DateFormat 中的格式一致 即可) java.text.SimpleDateFormat sdf new java.text.SimpleDateFormat("M/dd/yyyy hh:mm:ss a",java); java.......SimpleDateFormat常用法_计算机软件及应用_IT/计算机_专业资料。有关javaSInpleDateFormat类的常用操作 1. SimpleDateFo…

selenium打开Firefox、IE、Chrome浏览器【python】

selenium打开不同浏览器的脚本。 1.Firefox from selenium import webdriverdriverwebdriver.Firefox() driver.get("http://www.baidu.com") 这里要注意打开的域名一定要加前http:// 否则会报错:selenium.common.exceptions.WebDriverException: Messag…

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

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

java后端传object给js_【JSON】JSON在前端和后端传递

前后台最最传统的交互方式就是表单交互,然后用request.setAttribute方法设置结果,渲染jsp,然而随着前台界面的复杂程度的提高,或者是使用了某些前端框架(sigmagrid)越来越多的界面会使用异步方式提交数据。那么这个过程大致是什么…

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…

二维码的生成

我们目前用的是谷歌的zxing来生成二维码&#xff1b;下面呢我分别为大家介绍一下简单的二维码&#xff0c;中间有log的二维码&#xff0c;和彩色二维码&#xff1b; 需要两个权限&#xff1b; <uses-permission android:name"android.permission.CAMERA"/> <…

python读取python源代码文件_python 读写excel文件操作示例【附源码下载】

本文实例讲述了python 读写excel文件操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;对excel文件的操作&#xff0c;python有第三方的工具包支持,xlutils,在这个工具包中包含了xlrd,xlwt等工具包.利用这些工具&#xff0c;可以方便的对excel 进行操作。2. 安装,解…

Java工艺路线和工序_工序分散表现为工序多,工序内容( ),工艺路线长。

【其它】Baby-boomer parents seem to struggle with two things: saying no and letting go. (Para. 9)【填空题】若x5,y10,则x>y&&xy--的逻辑值是____________。【单选题】若a的值为3时,下面程序段被执行后,C的值是() c1 if(a>0) if(a>3) c2; else c3; else…

【代码升级】【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;但文件的管理和查找又十分烦琐无法胜任大数量的存储。将数据存储…

roll() java_Java Calendar roll()用法及代码示例

Calendar类中的roll(int calndr_field&#xff0c;boolean up_down)方法用于通过上下移动传递的字段单个时间单位来对传递的日历字段进行操作。这涉及在不更改较大字段的情况下对时间字段进行加法或减法。用法:public abstract void roll(int calndr_field, boolean up_down)参…

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

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