如何理解LeakCanary?

Den*_*nis 7 java android memory-leaks leakcanary

我已安装在你的proetk LeackCanary库中.它发现了一个内存泄漏,并且可能会要求我提供信息,但我无法理解它,因为我在课堂上没有这样的做法.如何准确理解错误的位置以及如何解决错误?谢谢.

public final class Activity扩展AppCompatActivity {

InterstitialAd mInterstitialAd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fci);
    getWindow().setBackgroundDrawable(null);

    final ImageButton btn_pas   = (ImageButton) findViewById(R.id.btn_pas);
    Glide.with(getApplicationContext()).load(R.drawable.fci_2).placeholder(R.color.white).into(btn_pas);

    mInterstitialAd = new InterstitialAd(this);
    mInterstitialAd.setAdUnitId("ca-app-pub-...");

    requestNewInterstitial();
}

@Override
public void onBackPressed() {
    if (mInterstitialAd.isLoaded()) {
        mInterstitialAd.show();
        super.onBackPressed();
    } else {
        super.onBackPressed();
    }
    requestNewInterstitial();
}

private final void requestNewInterstitial() {
    AdRequest adRequest = new AdRequest.Builder().build();
    mInterstitialAd.loadAd(adRequest);
}

public final void pas(View view) {
    Intent intent = new Intent(Activity.this, pas.class);
    startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)

}

我无法附上截图,所以我将描述写LeakCanary.

static hk.o
references ht.a
leaks Activity instance
Run Code Online (Sandbox Code Playgroud)

Dan*_*nai 0

您遇到泄漏是因为InterstitialAd保存了对活动的引用。你应该更换:

mInterstitialAd = new InterstitialAd(this);
Run Code Online (Sandbox Code Playgroud)

mInterstitialAd = new InterstitialAd(this.getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅我对类似问题的回答