美文网首页
Handler机制与注意

Handler机制与注意

作者: pascalb | 来源:发表于2017-09-20 18:28 被阅读0次

    关于Handler可能很多初学者有疑问,根据个人的经验整理了下面的笔记,希望能给大家有所帮助

    什么是Handler机制

    Handler机制是为了在子线程中通知UI线程(主线程)处理提供的一套机制
    两个主要基本作用
    1:延迟执行messages或runnables

    关于Handler机制的几个问题
    1:为什么要通过Handler来更新UI
    : 1:如果直接在UI(主线程)中处理复杂的逻辑或者网络请求等,很容易造成ANR
    : 2:Handler机制提供了MessageQueue确保消息的有序的处理

    2:子程中是否可以创建Handler
    : 可以,主线程可以通过这个Handler来发送信息给子线程,后面会以代码事例说明

    逐步了解Handler

    Handler机制的实现,必须得知道Message、MassageQueue以及Looper.下面一个个介绍下

    Message
    : Message主要是包含了消息体,用于发送给Handler

    //获取Message实例的方式
    Message msg1 = Message.obtain();
    //或
    Message msg2 = Handler.obtainMessage();
    
    //Message实例
    public final class Message implements Parcelable {
        public int what;
        public int arg1; 
        public int arg2;
        public Object obj;
        ...
        }
    
    //Post实例问题
     new Handler().postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    //这边是获取实例
                    Message msg = Message.obtain();
                }
            }, 500);
    //Post发送的不是Message?我们看下面的代码的实现
    
    public final boolean postDelayed(Runnable r, long delayMillis)
    {
        return sendMessageDelayed(getPostMessage(r), delayMillis);
    } 
    //调用getPostMessage获取的Message方法
    private static Message getPostMessage(Runnable r) {
            Message m = Message.obtain();
            m.callback = r;
            return m;
    }
    
    //优化delayMillis的实现,
    public final boolean sendMessageDelayed(Message msg, long delayMillis)
    {
        if (delayMillis < 0) {
        delayMillis = 0;
        }
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }
    //加入到消息队列,mQueue 在Handler声明时就注册
    public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
        MessageQueue queue = mQueue;
        if (queue == null) {
            RuntimeException e = new RuntimeException(
            this + " sendMessageAtTime() called with no mQueue");
            Log.w("Looper", e.getMessage(), e);
            return false;
        }
        return enqueueMessage(queue, msg, uptimeMillis);
    }
    
    
    
    

    MessageQueue
    MessageQueue: 消息队列 最后会调用使用Looper.myQueue()方法。主线程的已经实现了Looper,子线程的Looper要自己实现

    Looper
    作用就是开始消息的轮询, 主线程中已经实现了Looper,子线程中要自己实现,实现如下

    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();
            }
            
    
    //那么主线程中是怎么实现的,看main方法的实现
     public static void main(String[] args) {
            ...
            //初始化Looper
            Looper.prepareMainLooper();
    
            ActivityThread thread = new ActivityThread();
            thread.attach(false);
    
            if (sMainThreadHandler == null) {
                sMainThreadHandler = thread.getHandler();
            }
    
            if (false) {
                Looper.myLooper().setMessageLogging(new
                        LogPrinter(Log.DEBUG, "ActivityThread"));
            }
    
            // End of event ActivityThreadMain.
            Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            Looper.loop();
    
            throw new RuntimeException("Main thread loop unexpectedly exited");
        }
    }
    //在main函数中已经实现了,所以不用我们自己再次实现
    

    Handler
    Handler消息的发送才和接收者

    通过这Message、MassageQueue以及Looper的分析。相信应该可以很清楚的了解了Handler机制

    最后提供一张图可以更清楚的了解这中间过程


    这里写图片描述

    想更清楚的查看源码请看自己在线查看
    //API查看
    https://developer.android.com/training/index.html
    //5.0以前的代码查看
    http://www.grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/
    //官方源码查看
    https://android-review.googlesource.com/

    相关文章

      网友评论

          本文标题:Handler机制与注意

          本文链接:https://www.haomeiwen.com/subject/pknosxtx.html