之前的例子都是我们在子线程(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中线程之间的通信(四)主线程给子线程发送消息...相关推荐

  1. 从Android中Activity之间的通信说开来

    引言 最近两个星期在研究android的应用开发,学习了android应用开发的基础知识,基本控件,基本布局,基本动画效果,数据存储,http访问internet等等基础知识. android中有一个 ...

  2. java小项目租车系统_Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的"呱呱租车系统" 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金 ...

  3. 三十二、Java集合中的ArrayList

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  4. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...

  5. android 服务端 servlet webservice,Tomcat 上如何部署Servlet及Android中如何与服务器通信(12页)-原创力文档...

    Tomcat 上如何部署Servlet及Android中如何与服务器通信 下载Tomcat并安装 Apache Tomcat powers numerous large-scale, mission- ...

  6. 2022Java学习笔记八十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)

    2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现) 一.快速入门 DatagramPacket:数据包对象 实例代码 定义发送端 package com.zcl.d ...

  7. 【零基础学Java】—Java 日期时间(三十二)

    [零基础学Java]-Java 日期时间(三十二) DateFormat 是日期/时间格式化子类的抽象类,它以语言无关的方式格式化和分析日期或时间. 日期/时间格式化子类(如SimpleDateFor ...

  8. java线程集合点_Java多线程学习笔记(三) 甚欢篇

    使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...

  9. android中服务播放音乐,为什么我们需要Android中的服务?音乐播放也可以通过后台线程完成...

    采访中有人问我这个问题.我不确定这是否是问这个问题的合适论坛,因为它不涉及任何代码,而是对android概念的理解. 问题是"当所有事情都可以通过Android中的后台线程完成时,为什么我们 ...

最新文章

  1. 「模型解读」resnet中的残差连接,你确定真的看懂了?
  2. python --time()函数
  3. nginx 域名跳转 ---IP跳转----
  4. 分子计算机已经问世,纳米计算机指日可待?
  5. 二叉树的四种遍历方式(递归和非递归双重实现)
  6. pmd代码安全扫描工具
  7. JAVA面试题(part5)--多态与抽象类
  8. js中双感叹号_JavaScript中双叹号(!!)作用
  9. uuid java 重复_Java中使用UUID工具类生成唯一标志防止重复
  10. 基于jQuery实现自动或点击切换效果
  11. 在线内存泄露定位--memleak工具
  12. 图与图算法在实际中的应用
  13. 八大梦境提醒的你疾病所在 - 健康程序员,至尚生活!
  14. 遥感水文前景_【充电】学遥感必读的十本专业书
  15. flink程序在消费kafka数据时出现Error sending fetch request问题
  16. 决定人生高度的,不是智力,而是体力
  17. 神器大师泰兹瑞与威穆
  18. vue ssr之nuxt
  19. termios的例子
  20. 铸造数据安全堤坝,华为云数据灾备解决方案就是强

热门文章

  1. arrays合并两个数组_每天一道力扣题: 88. 合并两个有序数组
  2. php htmlspecialchars 不管用,php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总_php技巧...
  3. 计算机显示文本自定义130%,实训课题目
  4. oracle数据库9i安装,Oracle 9i数据库服务器的安装和辅助软件安装教程
  5. linux swap扩大_linux 扩展swap
  6. Fiddler抓包 | 竟然有这些骚操作,太神奇了?
  7. Python单元测试框架之unittest+requests+ddt+excel接口自动化测试
  8. xshell与xftp如何实现相互连接
  9. @PathVariable、@RequestParam、@RequestBody注解
  10. js获取一个月的天数