Looper、Handler 学习

1. Looper 方法

Looper 的作用:

  1. 循环读取 MessageQueene 内的 Message
  2. 将 Message 派发给 Handler 执行

Looper.prepareMainLooper(); // 为当前进程创建 Looper,一般是在应用进程初始化的时候调用 main 方法里面实现的,初始化函数
Looper.getMainLooper(); // 获取主线程的 Looper
Looper.loop(); // 开始当前的 Looper 执行,配套 prepareMainLooper() 内使用。作用:循环取出 MessageQueene 内的 message 并交给 Handler
Looper.prepare(); // 为当前线程设置 mLoop

MessageQueene
Looper
Handler
Message

流程:

  1. Handler 调用 sendToTarget() 方法将 Message 发送到 MessageQueene 内;
  2. MessageQueene 会调用 enqueueMessage() 方法将 Message 存储;
  3. Looper 流程是在 prepareMainLooper 方法内初始化,之后就调用 loop() 方法一直循环读取 MessageQueue 中的 Message 消息(在 MessageQueene 方法的 next() 方法内),并最终调用 msg.target.dispatchMessage(msg); 方法将消息推出去
  4. Handler 处理消息,逐次调用 dispatchMessage(msg) 方法,会调用到 handleMessage 方法,使用时会重写这个方法处理最终的消息

参考博客:https://blog.csdn.net/qq_30379689/article/details/53394061

3. Handler 主线程回调示例

private Thread mThread;
private final int MSG_SUCCESS = 1;

    
    
        if (mThread == null) {
            mThread = new Thread(runnable);
            Dialog dialog = DialogUIUtils.showMdLoading(this, "加载中...", true, true, true, true).show();
            mDialog = dialog;
            mThread.start();
        }


    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            List<AppInfo> appInfos = PackageInfoUtils.getAppInfoList(DUVCore.get().getContext());
            Log.i("Wooo", "--runnn---" + appInfos);
            mHnadler.obtainMessage(MSG_SUCCESS, appInfos).sendToTarget();
        }
    };


    private Handler mHnadler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case MSG_SUCCESS:
                    mAppInfos = (List<AppInfo>) msg.obj;
                    showListView(mAppInfos);
                    Log.i("Wooo", "--mhandle---" + mAppInfos);
                    break;
            }
        }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容