通过分析Activity源码,我们知道每个Activity都有一个Looper,所以主线程在接收Message是不需要调用Looper.prepare()和Looper.loop(),但是线程是不带Looper的,当线程要接收来自主线程的消息是就需要调用Looper.prepare()和Looper.loop()。以下我们将通过一个示例,讲述主线程和线程之间如何发送Message。

01 import android.app.Activity;
02 import android.os.Bundle;
03 import android.os.Handler;
04 import android.os.Message;
05 import android.widget.Toast;
06  
07 /**
08  * 这个类是主线程,它每隔两秒就发送一个Message给线程,线程收到Message后将发送一个Message给主线程,主线程收到Message后会将Message内容Toast出来。
09  * org.fneg.HandlerTestActivity.java
10  * Create at: 2012-6-4 下午9:39:19
11  * @author:feng
12  * Email:fengcunhan@gmail.com
13  *
14  */
15 public class HandlerTestActivity extends Activity {
16     private Handler uiHandler;
17     private ThreadWithLooper thread;
18     private Runnable showRunable;
19     @Override
20     public void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.main);
23         uiHandler=new Handler(){
24             @Override
25             public void handleMessage(Message msg) {
26                 switch(msg.what){
27                 case Messages.MSG_HELLO:
28                      Toast.makeText(HandlerTestActivity.this, (String)msg.obj, Toast.LENGTH_SHORT).show();
29                     break;
30                      
31                 }
32             }
33         };
34         thread=new ThreadWithLooper(uiHandler);
35          
36         thread.start();
37         showRunable=new Runnable() {
38              
39             @Override
40             public void run() {
41                 //給线程发送一个Message
42                 thread.getHandler().sendEmptyMessage(Messages.MSG_HELLO);
43                 uiHandler.postDelayed(this, 2*1000);
44             }
45         };
46         uiHandler.post(showRunable);
47          
48     }
49      
50     @Override
51     protected void onStop() {
52         super.onStop();
53         uiHandler.removeCallbacks(showRunable);
54     }
55 }
01 import android.os.Handler;
02 import android.os.Looper;
03 import android.os.Message;
04  
05 /**
06  * 从线程发送消息到UI线程(主线程)
07  * org.fneg.ThreadWithLooper.java
08  * Create at: 2012-6-4 下午4:58:11
09  * @author:feng<br/>
10  * Email:fengcunhan@gmail.com
11  *
12  */
13 public class ThreadWithLooper extends Thread {
14     private Handler handler;
15      
16     private Handler uiHandler;
17      
18     public ThreadWithLooper(Handler mHandler){
19         this.uiHandler=mHandler;
20         //初始化Handler,接收到主线程发送过来的Message就回复一个Message给主线程,消息内容是 一个字符串和当前时间
21         handler =new Handler(){
22  
23             @Override
24             public void handleMessage(Message msg) {
25                 switch(msg.what){
26                 case Messages.MSG_HELLO:
27                      Message message=new Message();
28                      message.what=Messages.MSG_HELLO;
29                      message.obj="Yes!I get a hello"+System.currentTimeMillis();
30                      uiHandler.sendMessage(message);
31                     break;
32                      
33                 }
34             }
35              
36         };
37     }
38      
39     public Handler getHandler() {
40         return handler;
41     }
42  
43     public void setHandler(Handler handler) {
44         this.handler = handler;
45     }
46      
47     @Override
48     public void run() {
49         Looper.prepare();
50          
51         Looper.loop();
52     }
53      
54      
55 }
01 /**
02  *
03  * org.fneg.Messages.java
04  * Create at: 2012-6-4 下午4:51:20
05  * @author:feng
06  * Email:fengcunhan@gmail.com
07  *
08  */
09 public class Messages {
10    public static final int MSG_HELLO=0X1;
11 }

Android 主线程和线程之间相互发送消息的更多相关文章

  1. Handler主线程子线程之间的互相通信

    Handler主线程子线程之间的互相通信 package com.wyl.dansnote; import android.app.Activity; import android.os.Bundle ...

  2. Android消息机制之实现两个不同线程之间相互传递数据相互调用

    目的:实现两个不同线程之间相互传递数据相互调用方法. 线程一中定义mainHandler 并定义一个方法mainDecode 线程二中定义twoHandler 并定义一个方法twoEncode 实现当 ...

  3. Android主线程的消息系统(Handler\Looper)

    前言: 之前的文章写的都是关于Bitmap和内存的优化技术,这一篇文章给大家谈谈Handler. Handler是Android系统中比较重要的一个知识,在Android多线程面试经常会被问到,在实际 ...

  4. android 主线程和子线程之间的消息传递

    从主线程发送消息到子线程(准确地说应该是非UI线程)  package com.zhuozhuo; import android.app.Activity; import android.os.Bun ...

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

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  6. Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

    MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...

  7. Android 主线程和子线程通信问题

        Android 如今不支持View在子线程中创建及调用其方法.假设要实现子线程内容更新之后.将结果及时反馈到主线程中,该怎样出来呢?     能够在主线程中创建Handler来实现. 这样子线 ...

  8. Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作

    前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...

  9. RxJava开发精要7 – Schedulers-解决Android主线程问题

    原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转 ...

随机推荐

  1. 【Leetcode】二叉树层遍历算法

    需求: 以层遍历一棵二叉树,二叉树的结点结构如下 struct tree_node{ struct tree_node *lc; struct tree_node *rc; int data; }; ...

  2. Oracle 表的常见操作

    --创建表并指定表空间 create table goods( id VARCHAR2(20) primary key, name VARCHAR2(20) NOT NULL, price NUMBE ...

  3. php排序算法之选择排序

    /** * 选择排序 * 不稳定排序 *工作原理: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推 ...

  4. [置顶] ANT build.xml文件详解

    Ant的优点 跨平台性.Ant是用Java语言编写的,所示具有很好的跨平台性. 操作简单.Ant是由一个内置任务和可选任务组成的. Ant运行时需要一个XML文件(构建文件). Ant通过调用targ ...

  5. 对于deferred的一点点理解

    deferred对象,是一个异步队列.能够实现异步代码调用,从而解决代码执行顺序的问题. 它提供了一下主要方法: jQuery.Deferred() 一个构造函数,返回一个链式实用对象方法来注册多个回 ...

  6. Sublime 学习记录(三) Emmet 插件

    i. 安装 : 打开命令面板 输入pci 回车  然后输入emmet 回车即可 ii.用处 : 快速编写html和css代码(快捷键:tab建) iii.html用法: 1)     初始化,html ...

  7. Android学习之DialogFragment

    DialogFrament是Android sdk中的对话框基类,开发人员可以针对此类进行扩展.他可以扩展出Android中的多种对话框,比如alertdialog,listdialog,radiod ...

  8. JS函数——作用域

    一 : 作用域的相关概念 首先看下 变量作用域 的概念:一个变量的作用域是程序源代码中定义这个变量的区域.————————<javascript权威指南>第六版全局变量拥有全局作用域,函数 ...

  9. Java中创建对象的5种方式 &&new关键字和newInstance()方法的区别

    转载:http://www.kuqin.com/shuoit/20160719/352659.html 用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: ...

  10. jsp中包含JAVA代码

    在JSP中大部分都是由脚本小程序组成,所谓的脚本小程序就是里面直接包含了JAVA代码. 在JSP中Scriptlet一共分为三种:        · <%%>:定义局部变量,编写语句    ...