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

Android 方法中的处理程序会泄漏内存吗?,android,memory-leaks,handler,Android,Memory Leaks,Handler,我知道类中声明的处理程序可能会泄漏内存,因为它持有对其外部类的引用。在这种情况下,我们应该使用弱引用的静态嵌套类 但是,如果在方法中声明了处理程序,该怎么办呢。我面对下面的情况,不确定这是一个正确的实施。有人能给我解释一下吗?我甚至不知道我应该寻找什么 private void methodA(){ Handler handler = new Handler(); handler.postDelayed(new Runnable() { @

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

但是,如果在方法中声明了处理程序,该怎么办呢。我面对下面的情况,不确定这是一个正确的实施。有人能给我解释一下吗?我甚至不知道我应该寻找什么

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");
}

在方法中创建
处理程序
并不是特例。它属于相同的情况,即您发布的
消息在被处理之前将一直存在于消息队列中

在一定条件下,它可以。如果传递的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);
}
私有静态MyRunnable实现Runnable
{
私人最终WeakReference myClass_weakRef;
公共MyRunnable(MyClass myClassInstance)
{
myClass_weakRef=新WeakReference(myClassInstance);
}
@凌驾
公开募捐
{
MyClass MyClass=MyClass_weakRef.get();
如果(myClass!=null)
myClass.methodB();
}
}
私有无效方法a()
{
Handler=newhandler();
handler.postDelayed(新的MyRunnable(this),10*1000);
}
因此,在处理消息之前,“文本视图”和活动不能是gc?