android面试-Handler机制(oppo面试)


要点:

面试的时候回答的最主要的点就是上面的这一个环形的框图,要能够清晰的表达出来,后面具体的源码细节才讲得有意义,不然前面一个整体框架都错了,后面怎么说都没用。

另外,本文是基于你已经看过Handler的源码基础上作出的总结,MQ的话主要就是一个入队以及出队,next可以看下源码,他就是一个循环,当没有信息的时候阻塞,而Loop也是一个循环,嵌套next,next阻塞Loop也阻塞。当调用quit或者quitSafe跳出循环的时候,next以及Loop就不再循环了。

了解源码还是有好处的,oppo一轮面试的时候刚好说了OkHttp有一个责任链的模式,然后面试官引导我怎么写,刚好想到Handler的这一个next以及loop的嵌套,所以最终也算是答出来了。

框架:

android的消息机制主要指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程,Handler主要作用就是将一个任务切换到指定线程中去运作,比如耗时的I/O操作,网络连接等

Handler:Handler内部是通过post方法将Runnable投递到Handler的Looper处理,或者通过send发送信息到Looper处理,post最终也是调用send方法调用。

ThreadLocal:当某些数据需要在以线程为不同的作用域并且不同的作用域数据不同时可以使用,解决同样的需求可以是使用静态变量供线程使用,另一种是以参数的形势传递,ThreadLocal的值是储存在Object[] table中,reference对象的索引为index,那么下一个就是Index+1就是localValue,set就是通过这样的办法put到里面去,而get是通过去指定索引的值,他们存取都是本线程对象的table数组,所以不会影响线程之间的存取。

MessageQueue:主要是两个操作,插入和读取,读取伴随着删除。enqueueMessage和next两个操作,MQ数据结构是通过链表完成,通过enqueueMessage完成入队的操作,即链表的插入,而next里面是一个死循环,当有消息时会通过调用next方法从单链表里移出,没有时则阻塞

Looper:Looper.prepare方法会为当前线程创建一个Looper,而Looper.loop这是开启消息循环。Looper有两个方法,quit以及quitSafely,quit会直接退出Looper,而quitSafely则会等待消息池的消息处理完毕之后在安全退出,如果手动为线程创建Looper,那么需要显示的去quit,否则线程会一直处于等待的状态。

loop是一个死循环,当MessageQueue的next返回null时则退出循环,否则就与next一起阻塞,否则就通过target调用handler的dispatchMessage处理消息。

Handler:
      1、sendMessageDelayed
     2. 在调用Handler.post(Runnable runnable)方法时,会将runnable封装成一个Message;
     3. 在队列执行时,会判断当前的Message里是否封装了Runnable,如果封闭了,就直接执行Runnable,如果没有,将当前的Message传递给handleMessage(Message msg)处理;
     4. Handler在实例化的时候可以设置一个callback<Handler.Callback>,callback也有一个handleMessage(Message msg)方法,如果步骤3中的Handler有callback,
     那么调用的是callback的handleMessage(Message msg),否则调用自身的handleMessage(Message msg)。

猜你喜欢

转载自blog.csdn.net/wzhworld/article/details/78337641
今日推荐