Handler

一,什么是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机制


image

                            四,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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。