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

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

最佳答案

在一定条件下可以。如果传递的 runnable 是匿名类或内部类,如您的示例所示,它包含对“this”的隐式引用并防止“this”被垃圾收集,直到 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);
}

关于android - 方法内部的处理程序会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162642/

相关文章:

android - 在 Docker 中为 Android 运行并行的 Gitlab CI 作业

java - 我的应用程序按钮不起作用,handler.java 错误

java - Gradle 多项目多重依赖

android - 应用程序小部件不会显示在应用程序抽屉中,似乎与无效尺寸有关

c++ - 内存泄漏 - STL 集

c# - 为什么最后一个关闭的 MDI 子窗体没有被垃圾回收?

java - 尝试使用将对象转换为字节数组时频繁GC

android - 这个 Handler 类应该是静态的,否则可能会发生泄漏

android - 从 App 到 Android 中的 SystemService 的通信

android - 如何在 Android Studio 中使用 Robotium?