Android 主线程和线程之间相互发送消息

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

 

01import android.app.Activity;
02import android.os.Bundle;
03import android.os.Handler;
04import android.os.Message;
05import 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 */
15public 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}

01import android.os.Handler;
02import android.os.Looper;
03import 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 */
13public 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 */
09public class Messages {
10   public static final int MSG_HELLO=0X1;
11}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值