
四大金刚
Handle、 MessageQueue、 Looper、 Runnable
1> Handler 原理
抽象一下
Handler: 快递员
Message: 包裹
MessageQueue: 快递分拣中心
Looper: 快递公司, 处理包裹去向
场景:
想给朋友寄一件礼物,首先你拿个箱子装好礼物并包裹好,下单叫了某家的快递员上门取件,快递员揽收你的包裹后,会将包裹送往快递分拣中心,等待配送车送出你的包裹。等配送车来了,就按照你的包裹地址信息,送到指定地方站点,然后分派给相应的快递员,将你的包裹送到你的朋友手里。
实际 应用:
需要刷新主界面的 TextView, 但是人不在 主线程, 就可以包装好 Message, 声明一个 Handler, 让 Handler 将你的 Message 送到主线程( Looper ), Handler 将你的 message 送到主线程后, 还需要排队等, 轮到你的时候, 主线程会告诉 Handler, 这个 message 可以处理了, 你负责 分发一下, 于是, Handler 将该 message 分发到相应的 回调 或者 handlerMessage() 方法中, 于是就在该方法中 更新了 ui。
1-1> Message ( 消息 )
1 号大佬, message 上线
Message.class // 在 android.os 包中data@miPC:~/ROSP-Android/frameworks/base/core/java/android/os$ vi Message.java
源文件定义 为:
public final class Message implements Parcelable {public int what;--------------public Message(){} //Message 有且 只有 1 个 无参构造方法除了 构造方法 创建实例对象还可以用 内部的 静态 static 方法 创建static Message obtain()static Message obtain(Message orig)static Message obtain(Handler h)static Message obtain(Handler h, Runnable callback)static Message obtain(Handler h, int what)static Message obtain(Handler h, int what, Object obj)static Message obtain(Handler h, int what, int arg1, int arg2)static Message obtain(Handler h, int what, int arg1, int arg2, Object obj)}这些 静态方法 都会 首先调用 第一个 方法来 创建一个 Message 对象Message m = obtain();
// 从全局池 返回 1个新的 消息实例, 允许在许多情况下避免分配新对象
public static final Object sPoolSync = new Object(); //同步锁对象private static Message sPool; //全局池消息实例public static Message obtain(){synchronized (sPoolSync ){if (sPool != NULL ){Message m = sPool;//---return m;}}return new Message();}
如果当前 全局池 的 Message 实例不为空, 则返回第一个消息实例所以 大多数情况下 使用 obtain() 获得1 个 Message 对象, 可以避免消耗更多的内存资源
其他的 static obtain() 的重载方法, 基本都是赋值操作
public static Message obtain(Handler h, Runnable callback) {Message m = obtain();m.target = h;m.callback = callback;return m;}// 该函数里的 target 是保护级别的 成员变量只有 同包名空间可以访问
Message有8个静态方法可以创建Message实例
Message有两个重要的成员变量,分别为target 和callback,一个是Handler,一个是Runnable。
Message有4个公开变量what、arg1、arg2、obj 可以存储消息进行传递
Message还有一个包间成员变量next,它是Message类型,后面会使用到,知道有这个next就行
1-2> Handler ( 处理 )
2号大佬, 处理机
Handler.class 也在 android.os 包内
function: 收消息 + 处理消息
快递员 收快递 , 领快递单、 派送快递
<1> 构造
Handler()Handler(Callback callback)Handler(boolean async)Handler(Callback callback, boolean async)Handler(Looper looper)Handler(Looper looper, Callback callback)Handler(Looper looper, Callback callback, boolean async)
上述 构造方法都是上面 1个1个 往下调的
关注 最后 1个
public Handler(Looper looper, Callback callback, boolean async) {mLooper = looper;mQueue = looper.mQueue;mCallback = callback;mAsynchronous = async;}
Handler是消息的处理者,但是它并不是最终处理消息的那个大佬,它有且只能有一个上级个领导,就是Looper,Handler是将消息上报给Looper(领导),然后排队等待,等Looper(领导)处理完消息了,就会通知Handler去领取消息,给Handler分配任务,Handler拿到消息后在自行往下分发,Handler只能听命与Looper(领导)。
注: 如果文章对你有帮助请点赞支持呀//!有问题可联系博主: snowzhang183@126.com
