Handler官方推荐处理内存泄漏的方法
很久没有写过博客了,之前的帐号都不知道密码了,随便写点东西吧,希望能把好的习惯捡起来
现在android开发一般使用个都是AS,在使用Handler内部类使用的时候会直接提示
This Handler class should be static or leaks might occur(大概意思就是handler类应该设置为静态的防止内存泄漏)
以下为谷歌官方推荐解决方法
Since this Handler is declared as an inner class, it may prevent the outer
class from being garbage collected. If the Handler is using a Looper or
MessageQueue for a thread other than the main thread, then there is no
issue. If the Handler is using the Looper or MessageQueue of the main
thread, you need to fix your Handler declaration, as follows: Declare the
Handler as a static class; In the outer class, instantiate a WeakReference
to the outer class and pass this object to your Handler when you
instantiate the Handler; Make all references to members of the outer class
using the WeakReference object.
中文大致翻译(某词典翻译,大概意思还算比较准确,就是说在主线程中使用handler类的时候,最好声明为静 态的类,使用软引用,便于系统的回收):
由于这个处理程序被声明为一个内部类,所以它可以防止外部类被垃圾收集。如果处理程序使用一个Looper或MessageQueue作为主线程以外的线程,则没有问题。如果处理程序正在使用主线程的Looper或MessageQueue,则需要修改处理程序声明,如下所示:将处理程序声明为静态类;在外部类中,对外部类实例化一个弱引用,并在实例化处理程序时将该对象传递给您的处理程序;使用WeakReference对象对外部类的成员进行所有引用。
写一个类继承Handler类;
private static class NoLeakHandler extends Handler {
private WeakReference<Activity> activityWeakReference;
public NoLeakHandler(Activity activity) {
activityWeakReference = new WeakReference<>(activity);
}
/** 你要做的操作*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
}
在使用时,直接创建该类即可
private NoLeakHandler handler = new NoLeakHandler(activity);
后记:当然还有其它的处理方式,例如在activity生命周期销毁的时候调用
handler.removeCallbacksAndMessages(null);
网友评论