【问题标题】:Why does Android Studio warn about a handler reference leak in this Activity Handler code?为什么 Android Studio 在此 Activity 处理程序代码中警告处理程序引用泄漏?
【发布时间】:2016-08-12 12:24:26
【问题描述】:

我正在编写一些 Activity 代码,但遇到了我不理解的 Android Studio 警告。这是产生警告的代码的最小版本:

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class TestActivity extends Activity {

    private static Handler mActivityHandler = new Handler() {
        // Android Studio 1.5.1 warns of a leak here
    };

    protected void onCreate( Bundle state ) {
        super.onCreate( state );
        mActivityHandler.sendEmptyMessageDelayed( 0, 10L );
    }
}

Android Studio 1.5.1 以黄色突出显示注释指示的 new Handler() { } 的正文,并显示以下消息:

处理程序引用泄漏

由于这个 Handler 被声明为一个内部类,它可能会阻止外部类被垃圾回收。如果 Handler 对主线程以外的线程使用 Looper 或 MessageQueue,则没有问题。如果 Handler 使用的是主线程的 Looper 或 MessageQueue,则需要修正你的 Handler 声明,如下: 将 Handler 声明为静态类;在外部类中,对外部类实例化一个WeakReference,并在实例化Handler时将此对象传递给你的Handler;使用 Wea​​kReference 对象对外部类的成员进行所有引用。

代码运行良好(当我为本示例删除的其余代码被放回时!)但我想了解警告并找到修复它的方法。

是否有另一种编写代码的方法来避免此警告?

【问题讨论】:

  • 可以在here找到一个很好的解释和修复警告。
  • 您的特定示例对我来说很有趣,因为您创建了匿名 Handler 的静态实例。我很好奇警告是否真的适用于这种情况,因为您没有对TestActivity.this 的隐式引用。
  • 解释和建议的补救措施怎么不够?
  • @323go:我相信这个解释对于有经验的 Android 和 Java 开发人员来说已经足够了。但如果我对此感到困惑,我怀疑其他人可能也是。目前,我很高兴能按原样运行代码,即使有警告。但我当然不喜欢这样的警告!所以我发布了这个问题,以防它帮助我的其他人。 :-)

标签: java android


【解决方案1】:

我今天也收到了这个警告。虽然我不像你这样有经验的开发者,但是在这里,你可以将mActivityHandler 声明为一个全局对象并实现Handler.Callback,然后通过传递活动的上下文来实例化mActivityHandler

是否有另一种编写代码的方法来避免此警告?

    public class TestActivity extends Activity implements Handler.Callback {

    private static Handler mActivityHandler;

    protected void onCreate( Bundle state ) {
        super.onCreate( state );
        mActivityHandler=new Handler(this);
        mActivityHandler.sendEmptyMessageDelayed( 0, 10L );
    }

    @Override
    public boolean handleMessage(@NonNull Message msg) {
        return true;
    }
}

这帮助我消除了 Handlerleak 的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多