您的位置:首页 > 产品设计 > UI/UE

浅谈Looper handler Message MessageQueue bundle parcel parcelable

2015-11-03 14:19 525 查看
---恢复内容开始---

这些概念有些时候有点搞不清楚,我们看下源码进行分析.

1.首先是parcelable,public interface Parcelable,它是一个接口,是所有传递消息相关class都遵循的接口。它的作用是它的子类的实例可以写入Parcel也可以从Parcel中读出,我们可以理解成是Android序列化的特有表现形式,对象的参数写入包裹传递,消息处理后再从包裹取出。Bundle, Message等都实现了此接口。我们也可以自己设计结构实现它的接口,用于某种消息传递,必须实现Parcelable.Creator.

<pre>
* public class MyParcelable implements Parcelable {
*     private int mData;
*
*     public int describeContents() {
*         return 0;
*     }
*
*     public void writeToParcel(Parcel out, int flags) {
*         out.writeInt(mData);
*     }
*
*     public static final Parcelable.Creator<MyParcelable> CREATOR
*             = new Parcelable.Creator<MyParcelable>() {
*         public MyParcelable createFromParcel(Parcel in) {
*             return new MyParcelable(in);
*         }
*
*         public MyParcelable[] newArray(int size) {
*             return new MyParcelable[size];
*         }
*     };
*
*     private MyParcelable(Parcel in) {
*         mData = in.readInt();
*     }
* }</pre>


2.public final class Parcel ,它不可继承.我们看一段官网上关于它的描述

* Container for a message (data and object references) that can
* be sent through an IBinder. A Parcel can contain both flattened data
* that will be unflattened on the other side of the IPC (using the various
* methods here for writing specific types, or the general
* {@link Parcelable} interface), and references to live {@link IBinder}
* objects that will result in the other side receiving a proxy IBinder
* connected with the original IBinder in the Parcel.

Parcel是ipc通信传输数据和对象的容器,通过IBinder来实现本地和远程的交互。由此它是特殊的序列化,更加的高效,所有的操作都在内存中进行.它定义了各种数据类型的读写操作。

3.public final class Bundle implements Parcelable, Cloneable,我们看下它官网的描述 A mapping from String values to various Parcelable types.

Bundle是string 到Parcelable对象的映射,实质就是个ArrayMap<String,Parcelable>,用来打包数据,轻量级.

4.public final class Message implements Parcelable,Message是MessageQueue的元素,用于线程的消息处理。它的数据域包含Bundle。

一般Message.obtain();或者Handler.obtainMessage();来获取消息,可以复用资源池回收的消息。定义的MAX_POOL_SIZE = 50;这里的资源池实际上是个链表.

5.public final class MessageQueue,它其实也是个链表,实现一些进出队列的操作。它通过Handler和具体的线程绑定。

6.public final class Looper,UI线程的Looper是由Android framework来构建的,一般的线程是没有Looper的。Looper可以理解成是包含MessageQueue的类,线程由此处理传递过来的消息。一般使用上

*  class LooperThread extends Thread {
*      public Handler mHandler;
*
*      public void run() {
*          Looper.prepare();
*
*          mHandler = new Handler() {
*              public void handleMessage(Message msg) {
*                  // process incoming messages here
*              }
*          };
*
*          Looper.loop();
*      }
*  }


View Code
其他线程也可以获取Looper来进行消息处理.

7.Handler 用于传递消息到MessageQueue,根据回调来HandleMessage();值得注意的是一般都是Handler在创建的时候自动和创建它的线程绑定,默认下new Handler()是向UI线程绑定,由此向UI线程的MessageQueue发送Message;如果向其他线程创建的Looper发送消息,必须创建之初绑定到其他线程上。

以上,大致理清了之间的关系.

---恢复内容结束---
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: