java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...
之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码:
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
activity_main.xml
上面的问题貌似没什么错误,但运行时却出错
抛出异常:
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。修改一下上面的代码。
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
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中取出消息。
java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...相关推荐
- 从Android中Activity之间的通信说开来
引言 最近两个星期在研究android的应用开发,学习了android应用开发的基础知识,基本控件,基本布局,基本动画效果,数据存储,http访问internet等等基础知识. android中有一个 ...
- java小项目租车系统_Java学习笔记三十:Java小项目之租车系统
Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...
- 三十二、Java集合中的ArrayList
@Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...
- android 服务端 servlet webservice,Tomcat 上如何部署Servlet及Android中如何与服务器通信(12页)-原创力文档...
Tomcat 上如何部署Servlet及Android中如何与服务器通信 下载Tomcat并安装 Apache Tomcat powers numerous large-scale, mission- ...
- 2022Java学习笔记八十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)
2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现) 一.快速入门 DatagramPacket:数据包对象 实例代码 定义发送端 package com.zcl.d ...
- 【零基础学Java】—Java 日期时间(三十二)
[零基础学Java]-Java 日期时间(三十二) DateFormat 是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间. 日期/时间格式化子类(如SimpleDateFor ...
- java线程集合点_Java多线程学习笔记(三) 甚欢篇
使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...
- android中服务播放音乐,为什么我们需要Android中的服务?音乐播放也可以通过后台线程完成...
采访中有人问我这个问题.我不确定这是否是问这个问题的合适论坛,因为它不涉及任何代码,而是对android概念的理解. 问题是"当所有事情都可以通过Android中的后台线程完成时,为什么我们 ...
最新文章
- 「模型解读」resnet中的残差连接,你确定真的看懂了?
- python --time()函数
- nginx 域名跳转 ---IP跳转----
- 分子计算机已经问世,纳米计算机指日可待?
- 二叉树的四种遍历方式(递归和非递归双重实现)
- pmd代码安全扫描工具
- JAVA面试题(part5)--多态与抽象类
- js中双感叹号_JavaScript中双叹号(!!)作用
- uuid java 重复_Java中使用UUID工具类生成唯一标志防止重复
- 基于jQuery实现自动或点击切换效果
- 在线内存泄露定位--memleak工具
- 图与图算法在实际中的应用
- 八大梦境提醒的你疾病所在 - 健康程序员,至尚生活!
- 遥感水文前景_【充电】学遥感必读的十本专业书
- flink程序在消费kafka数据时出现Error sending fetch request问题
- 决定人生高度的,不是智力,而是体力
- 神器大师泰兹瑞与威穆
- vue ssr之nuxt
- termios的例子
- 铸造数据安全堤坝,华为云数据灾备解决方案就是强
热门文章
- arrays合并两个数组_每天一道力扣题: 88. 合并两个有序数组
- php htmlspecialchars 不管用,php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总_php技巧...
- 计算机显示文本自定义130%,实训课题目
- oracle数据库9i安装,Oracle 9i数据库服务器的安装和辅助软件安装教程
- linux swap扩大_linux 扩展swap
- Fiddler抓包 | 竟然有这些骚操作,太神奇了?
- Python单元测试框架之unittest+requests+ddt+excel接口自动化测试
- xshell与xftp如何实现相互连接
- @PathVariable、@RequestParam、@RequestBody注解
- js获取一个月的天数