美文网首页
(七)Handler面试问题

(七)Handler面试问题

作者: lkmc2 | 来源:发表于2017-07-28 11:55 被阅读90次

一、什么是Handler

Android中,只有主线程能更新UI,如果在子线程更新UI则会抛出异常。因此需要使用Handler,Handler是一种更新UI的机制,可以在子线程完成耗时操作之后,通过Handler发送消息通知主线程来更新UI。

Handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue。

1.可以让对应的Message和Runnable在未来的某个时间点进行处理。

2.让自己想要处理的耗时操作放在子线程,让更新UI的操作都放在主线程。

Handler的作用:发送消息;接收和处理消息。

二、Handler的使用方法

1.post(runnable) //此时更新UI的操作写在Runnable中

2.sendMessage(message) //此时更新UI的操作写在Handler的handleMessage方法中。

在类的成员属性中新建一个Handler并复写handleMessage方法,这个Handler是绑定在主线程上的,在子线程中执行完耗时操作之后,新建一个Message对象,为其设置what属性,之后通过Handler的sendMessage(message)方法给主线程发送消息,之后Handler会调用handleMessage方法进行处理。

三、Handler机制的原理

Handler原理图

Looper是每个线程所独有的,通过loop方法,读取所绑定的MessageQueue中的消息,读到消息之后,把消息发送给Handler进行处理;而Handler发送的消息,会发送到相关线程的MessageQueue,而MessageQueue又是Looper所关联的,所以Handler要发送消息必须有一个维护它的Looper。Looper、MessageQueue、Handler三者是相关联的。

Looper处理机制

四、Handler引起的内存泄漏以及解决办法

泄漏原因:当Handler不是静态内部类的时候,它会隐秘地持有Activity的引用;当Activity想要回收的时候,Handler内部可能在做一些耗时操作,Handler不能被释放,所以它所持有地Activity的引用也不能被释放。导致Activity没有被回收,造成了内存泄漏。

解决办法

1.Handler内部持有外部Activity的弱引用。

2.把Handler改成静态内部类。

3.调用mHandler.removeCallback()。

相关文章

网友评论

      本文标题:(七)Handler面试问题

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