方法内的处理程序会泄漏内存吗?

时间:2014-03-04 04:01:43

标签: android memory-leaks handler

我知道在类中声明的处理程序可能会泄漏内存,因为它包含对其外部类的引用。在这种情况下,我们应该使用带有弱引用的静态嵌套类。

但是如果在方法中声明了处理程序,该怎么办?我遇到了以下情况,并不确定它是否正确实施。有人可以解释或给我一个提示吗?我甚至不知道应该搜索什么。

private void methodA(){
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {            
        @Override
            public void run() {
            methodB();
        }
    }, 10*1000);

private void methodB(){
    //textView holds a reference to a activity
    textView.setText("hello");
}

2 个答案:

答案 0 :(得分:2)

它可以在某些条件下。如果传递的runnable是匿名或内部类,如在您的示例中,它包含对“this”的隐式引用,并防止“this”被垃圾收集,直到runnable被从队列中处理掉(因此,如果您的方法永远不会运行,就像你的处理程序线程在没有清除队列的情况下被停止一样,它会泄漏)。

如果您担心发生内存泄漏或挂在对象上的条件太长,那么您需要使runnable成为在构造函数中初始化了弱引用的静态类,如:

private static MyRunnable implements Runnable
{
    private final WeakReference<MyClass> myClass_weakRef;

    public MyRunnable(MyClass myClassInstance)
    {
        myClass_weakRef = new WeakReference(myClassInstance);
    }

    @Override
    public void run()
    {
        MyClass myClass = myClass_weakRef.get();
        if(myClass != null)
            myClass.methodB();
    }
}

private void MethodA()
{
    Handler handler = new Handler();
    handler.postDelayed(new MyRunnable(this), 10*1000);
}

答案 1 :(得分:0)

在方法中创建Handler不是特例。它属于相同的情况,因为您发布的Message将一直存在于消息队列中,直到它被处理为止。