一,什么是handler
二,handler的使用
三,handler机制原理
四,handler引起的内存泄漏和解决方法
一,什么是handler
在子线程中发送消息给主线程来更新ui,子线程可做耗时操作
------------->主线程---->通过handler消息发送机制
handler,Android消息机制的上层接口,我们只需要知道,创建handler复写handlerMessage()方法,就可以使用。也可以简单是为可更新ui的一种机制,但是在更新ui的同时,还有很多其他的用途,耗时操作,文件读取,网络数据获取。
handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue
1)可以让对应的message和Runnable在未来的某个时间点进行相应处理;
2)让自己想要处理的耗时操作放在子线程,让更新ui的操作放在主线程
二,handler的使用方法
1,post(runnable)handle中消息延迟的做法
2,sendMessage(message)主线程和子线程间消息传递
在android中,new Handler()的话,会绑定到当前程序的主线程
三,handler机制
四,Handler引起的内存泄漏以及解决方法
原因:
静态内部类持有外部类的匿名引用,导致外部activity无法释放。
解释:
因为创建Handler不是静态内部类,会隐秘地持有这个activity地引用,当activity要被回收时,handler没有被释放,handler内部有可能在做一些耗时的操作,所以导致handler无法被释放,handler持有的activity的引用也没有释放,导致activity没有被回收,停留在内存当中,就造成了内存泄漏。
因为这么写:
private Handler mhandler = new Handler();
导致了内存的泄漏
所以要这么写
private static Handler uihandler = new Handler();
如果要在这个静态内部类中调用外部的activity类,可以使用弱引用来处理,而不要直接使用activity来创建。
解决方法:
1,handler内部持有外部activity的弱引用;
2,并把handler改为静态内部类
3,在activity中的onDestory()中调用mHandler的removeCallback()