MainActivity如下:

package cc.c;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.TextView;
/*** Demo描述:* * 示例步骤如下:* 1 子线程给子线程本身发送消息* 2 收到1的消息后,子线程给主线程发送消息* 3 收到2的消息后,主线程给子线程发送消息* * 为实现子线程给自己本身发送消息,关键还是在于构造Handler时传入的Looper.* 在此就传入该子线程自己的Looper即调用Looper.myLooper(),代码如下:* Looper.prepare();* mHandlerTest1=new HandlerTest1(Looper.myLooper());* Looper.loop();* * 所以当mHandlerTest1.sendMessage(message);发送消息时* 当然是发送到了它自己的消息队列.* * 当子线程中收到自己发送的消息后,可继续发送消息到主线程.此时只要注意构造* Handler时传入的Handler是主线程的Handler即可,即getMainLooper().* 其余没啥可说的.* * * 在主线程处理消息后再发消息到子线程* * * 其实这些线程间发送消息,没有什么;关键还是在于构造Handler时传入谁的Looper.**/
public class MainActivity extends Activity {private TextView mTextView;private HandlerTest1 mHandlerTest1;private HandlerTest2 mHandlerTest2;private int counter=0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}private void init() {mTextView = (TextView) findViewById(R.id.textView);//1 子线程发送消息给本身new Thread() {public void run() {Looper.prepare();mHandlerTest1=new HandlerTest1(Looper.myLooper());Message message = new Message();message.obj = "子线程发送的消息Hi~Hi";mHandlerTest1.sendMessage(message);Looper.loop();};}.start();}private class HandlerTest1 extends Handler {private HandlerTest1(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);System.out.println("子线程收到:" + msg.obj);//2  收到消息后可再发消息到主线程mHandlerTest2=new HandlerTest2(getMainLooper());Message message = new Message();message.obj = "O(∩_∩)O";mHandlerTest2.sendMessage(message);}}private class HandlerTest2 extends Handler {private HandlerTest2(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mTextView.setText("在主线程中,收到子线程发来消息:" + msg.obj);//3  收到消息后再发消息到子线程if (counter==0) {Message message = new Message();message.obj = "主线程发送的消息Xi~Xi";mHandlerTest1.sendMessage(message);counter++;}}}}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world"android:layout_centerInParent="true"android:layout_marginTop="70dip" /></RelativeLayout>

对于Android Handler与Message的多线程消息的处理,为什我以下代码会死掉? 看看,

1.线程没有终止条件,会一直给主线程发消息,主线程不停的调用handleMessage代码,很容易ANR(应用程序不响应)
2.handler.obtainMessage()得到message对象比new Message();更高效

Android Handler机制 怎使用?

Handler对象与其调用者在同一线程中,如果在Handler中设置了延时操作,则调用线程也会堵塞。每个Handler对象都会绑定一个Looper对象,每个Looper对象对应一个消息队列(MessageQueue)。如果在创建Handler时不指定与其绑定的Looper对象,系统默认会将当前线程的Looper绑定到该Handler上。
在主线程中,可以直接使用new Handler()创建Handler对象,其将自动与主线程的Looper对象绑定;在非主线程中直接这样创建Handler则会报错,因为Android系统默认情况下非主线程中没有开启Looper,而Handler对象必须绑定Looper对象。这种情况下,需先在该线程中手动开启Looper(Looper.prepare()-->Looper.loop()),然后将其绑定到Handler对象上;或者通过Looper.getMainLooper(),获得主线程的Looper,将其绑定到此Handler对象上。
Handler发送的消息都会加入到Looper的MessageQueue中。一说Handler包含两个队列:线程队列和消息队列;使用Handler.post()可以将线程对象加入到线程队列中;使用Handler.sendMessage()可以将消息对象加入到消息队列中。通过源码分析证实,Handler只有一个消息队列,即MessageQueue。通过post()传进去的线程对象将会被封装成消息对象后传入MessageQueue。
使用post()将线程对象放到消息队列中后,当Looper轮询到该线程执行时,实际上并不会单独开启一个新线程,而仍然在当前Looper绑定的线程中执行,Handler只是调用了该线程对象的run()而已。如,在子线程中定义了更新UI的指令,若直接开启将该线程执行,则会报错;而通过post()将其加入到主线程的Looper中并执行,就可以实现UI的更新。
使用sendMessage()将消息对象加入到消息队列后,当Looper轮询到该消息时,就会调用Handler的handleMessage()来对其进行处理。再以更新UI为例,使用这种方法的话,就先将主线程的Looper绑定在Handler对象上,重载handleMessage()来处理UI更新,然后向其发送消息就可以了。

转载于:https://www.cnblogs.com/xgjblog/p/5258947.html

Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解...相关推荐

  1. 多线程,主线程与子线程的通信Handler Message sendmessage与handlemessage obtainmessage

    android是单线程的,在子线程中是不能修改UI线程的任何操作,所以要用一种方式让子线程中的信息返回到主线程中再做修改.这就要让主线程与子线程通信. 那如何让它们之间进行通信呢?我们用Handler ...

  2. android判断主线程_Android主线程和子线程区别详解

    主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法. 线程唯一标示符:Thread.CurrentThread.ManagedThreadID; UI界面和Main函数均为 ...

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

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

  4. Looper、Handler应用---实现主线程向子线程发送消息

    准备知识: Looper类:为一个线程开启一个消息循环,里面有一个消息队列,新线程是没有开启消息循环的,所以需要用到Looper的方法创建消息循环(主线程除外,主线程会自动为其创建Looper对象,开 ...

  5. Android之用Handler实现主线程和子线程互相通信以及子线程和子线程之间的通信

    1.上代码 activity_main.xml文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/ ...

  6. Android Handler主线程和一般线程通信的应用分析

    Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进 ...

  7. linux安卓主线程同步,Android解决:使用多线程和Handler同步更新UI

    如果运行时,可以看到滚动条由条慢慢变短,则说明程序成功了.截图如下,建议选择大点的文件做测试. main.xml xmlns:Android="http://schemas.android. ...

  8. Android攻城狮 Handler与子线程

    Handler和线程是相关联的.再次强调:不可以在主线程中做耗时操作,就比如示例里面主线程中的 handlerMessage(),不能执行耗时操作.创建一个与自定义线程相关的Handler的代码: c ...

  9. Handler消息机制详解

    Handler机制是Android开发中最常见的机制,可以说贯穿整个Android,在探究Handler机制原理之前,我们先来捋一下用法 1.handler.post(Runnable) 2.hand ...

最新文章

  1. 那些在海外市场奋斗的华为人
  2. 如何妙笔勾檀妆:像素级语义理解
  3. Love2D游戏引擎制作贪吃蛇游戏
  4. 六年级下计算机课ppt课件ppt课件,信息技术六年级《第7课 机器人沿线行走》ppt课件(苏科版)...
  5. php搭建云服务器,云服务器上如何搭建php环境
  6. 服饰贴图定制小程序V1.2.4安装更新一体包+小程序前端
  7. Mybatis-SpringBoot集成/配置
  8. c语言 overflow_一文读懂:C语言编程中“堆”和“栈”的七大区别
  9. java大数据和python大数据的全面对比,哪个更主流?
  10. 老九门略--盗墓笔记老九门是哪九门(后附最新老九门电视剧百度云地址--不时更新)
  11. VirtualBox安装Windows XP——图解
  12. 使用 wpa_supplicant 连接 WiFi
  13. [第四篇] PostGIS:“我让PG更完美”
  14. LINUX下PHP扩展开发:第一个C扩展
  15. 教师资格证考69分是怎么算的?
  16. 数据挖掘导论学习笔记 第五章 分类算法
  17. 一文看懂川土微电子隔离器核心技术
  18. 视频剪辑怎么自学?其实剪辑很简单
  19. 高新技术企业定义和好处
  20. TabLayout+ViewPager+Fragment实现切页展示

热门文章

  1. ubuntu系统中root的2种pip路径
  2. 利用datagrip从hive导入csv数据(还没整理完)
  3. STATIC_URL/STATIC_ROOT/STATICFILES_DIRS/urls.py中的static区别
  4. maven零基础从配置到运行helloworld(java maven helloworld)
  5. 刪除github上的一個repository
  6. mysql delete in死锁_mysql 执行delete引发死锁问题
  7. mysql导出数据到本地_mysql怎么导出数据到本地文件
  8. Ext 入门 (05) 打印+gridpanel()方法
  9. 计算机应用基础19秋在线作业2,计算机应用基础19春在线作业2.doc
  10. 是什么职位_为什么说,质量工程师岗位变成了 “寡妇职位”?