Android面试指南-面霸之路06-handler及mvp架构分析、设计

来源:互联网 发布:电影售票软件 编辑:程序博客网 时间:2024/04/28 03:51

Handler理解1:
Message有两种创建方式,1)new Message 2)Message.obtain 。
每一个Message需要Handler来发送,handler有sendMessage方法,当sendMessage方法被调用,把msg带到Messqueue里。
Messqueue的 enqueueMessage方法,对msg进行排序,按照时间。如果发现刚在发送的msg排在队列的头部,就会唤醒主线程,让主线程去处理,去取。
Looper 主线程中队列已经创建,它是死循环,不停的去messqueue(消息队列)里去取消息。使用queue.next()方法,取到后就分发给Handler,就是传递到Handler里,如果没有取到就阻塞。等待下一次子线程来唤醒。 
调用的是message.target.dispathMessage()方法。
dispathMessage就会调用handlerMessage方法。


Handler理解2:

1、首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。

2、Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。

3、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。

4、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。

5、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。


好了,总结完成,大家可能还会问,那么在Activity中,我们并没有显示的调用Looper.prepare()和Looper.loop()方法,为啥Handler可以成功创建呢,这是因为在Activity的启动代码中,已经在当前UI线程调用了Looper.prepare()和Looper.loop()方法。

Handler理解3:
Handler机制
andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
Message Queue(消息队列):用来存放线程放入的消息。
线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。



  • 设计mvp程序架构 
例如:


  • 在Android的MVP架构中,使用了什么设计模式
Observer模式:通过EventBus实现订阅者,发布者的功能,实现 Model与 Presenter 的交互。
Proxy模式:View保持对Presenter的引用,通过Presenter代理,进行交互操作。
0 0
原创粉丝点击