Android 消息机制

来源:互联网 发布:电子海报制作软件 编辑:程序博客网 时间:2024/06/06 18:23

前言:

关于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();//建立一个消息循环,该线程不会退出  } }```
0 0