Handler的理解
博客专区 > 新年 的博客 > 博客详情
Handler的理解
新年 发表于3年前
Handler的理解
  • 发表于 3年前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】买域名送云解析+SSL证书+建站!>>>   



******************************************************************************************************

public class Handler{
    //构造方法的作用
    //1.拿到Looper
    //2.拿到Looper中的MessageQueue
    public  Handler(){
        mLooper = Looper.myLooper();
        mQueue = mLooper.mQueue;
        //mCallback  =  null;
    }

    //发送消息sendMessage最终调用的方法
    //1.将要发送的Message的target设置为this
    //2.将要发送的Message传递给Looper中的MessageQueue的方法enqueueMessage()
    public boolean sendMessageAtTime(Message msg, long uptimeMillis){
        boolean sent = false;
        if(mQueue !=  null){
            msg.target = this;
            sent = mQueue.enqueueMessage(msg, uptimeMillis);
        }
        return sent;
    }
}

********************************************************************************************

public class Looper{
    // sThreadLocal.get() will return null unless you've called prepare().
    static final ThreadLocal<Looper> sThreadLocal =
        new ThreadLocal<Looper>();

    private static Looper sMainLooper;  // guarded by Looper.class

    final MessageQueue mQueue;
    final Thread mThread;
    volatile boolean mRun;

    private static void prepare(boolean quitAllowed) {
        sThreadLocal.set(new Looper(quitAllowed));
    }

    //从线程局部变量中拿出Looper
    public static Looper myLooper() {            
        return sThreadLocal.get();
    }
    //从线程局部变量中拿出Looper
    public static void prepareMainLooper() {
        prepare(false);
        synchronized (Looper.class) {
            sMainLooper = sThreadLocal.get();
        }
    }

    public static void loop() {
// sThreadLocal.get();拿出线程局部变量的Looper
        final Looper me = myLooper();        
//拿到消息队列
        final MessageQueue queue = me.mQueue;    

        // Make sure the identity of this thread is that of the local process,
        // and keep track of what that identity token actually is.
        Binder.clearCallingIdentity();
        final long ident = Binder.clearCallingIdentity();

        //循环从消息队列中拿消息,
        for (;;) {
            Message msg = queue.next(); // might block//可能阻塞的方法
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }

            msg.target.dispatchMessage(msg);        //调用Handler的发送消息
            msg.recycle();        //消息回收
        }
    }
}

******************************************************************************
public class MessageQueue {
    // True if the message queue can be quit.
    private final boolean mQuitAllowed;

    @SuppressWarnings("unused")
    private int mPtr; // used by native code

    Message mMessages;
    private final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>();
    private IdleHandler[] mPendingIdleHandlers;
    private boolean mQuiting;

    // Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout.
    private boolean mBlocked;

    // The next barrier token.
    // Barriers are indicated by messages with a null target whose arg1 field carries the token.
    private int mNextBarrierToken;

    private native void nativeInit();
    private native void nativeDestroy();
    private native void nativePollOnce(int ptr, int timeoutMillis);
    private native void nativeWake(int ptr);
}

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 7
博文 83
码字总数 45935
×
新年
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: