Android 消息机制

前言:

关于Android的消息机制,因为涉及的东西太多,网上讲的都深浅不一,我这边结合Android源码和身边的实际应用对其进行总结,不打算一次总结完毕,后面会慢慢完善.

涉及内容: Handler, Looper, Message, MessageQueue,Thread.

Handler

Android提供了一种异步回调机制handler,允许我们在完成很长时间的任务后做出相应的通知.

作用:(结合Sundy的Android讲义)
a.执行预定任务
b.线程之间通信

并不是所有的线程都有looper对象.
Handler是如何与Looper建立联系的?

Handler的构造函数中有这样的代码:
handler.java

 mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;

在新建Handler时需要设置mLooper成员,Looper.myLooper是从当前线程中获取绑定的looper对象:
looper.java

public static final Looper myLooper() {
        return (Looper)sThreadLocal.get();
    }```

若Looper对象没有创建,就会抛异常"Can't create handler inside thread that has not called Looper.prepare()".


如何将一个普通线程变成loope线程?或者如何在新开的线程中创建handler?
常用的写法:

 class MyThread extends Thread {
 public void run() 
 {                
      Log.d(Constant.TAG, MessageFormat.format("Thread[{0}]-- run...",                                    Thread.currentThread().getName()));
        // 其它线程中新建一个handler
       Looper.prepare();
       // 创建该线程的Looper对象,用于接收消息,
       //在非主线程中是没有looper的所以在创建   
       //handler前一定要使用prepare()创建一个Looper
       myThreadHandler = new Handler() 
       {
         public void handleMessage(android.os.Message msg) 
         {
              Log.d(Constant.TAG, MessageFormat.format("Thread[{0}]--myThreadHandler handleMessage run...",                                                               Thread.currentThread().getName()));
          }
      };
   Looper.myLooper().loop();//建立一个消息循环,该线程不会退出
  }
 }```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值