安卓Admob插页式广告内存泄漏问题

3
我正在尝试在某些活动结束时展示插页式广告。问题是,这些广告似乎会阻止活动被垃圾收集,导致内存溢出异常。我该如何解决这个问题?提前感谢。
public class AdActivity extends FragmentActivity{

//...

protected InterstitialAd interstitial;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //...

    // Create the interstitial.
    interstitial = new InterstitialAd(this);
    interstitial.setAdUnitId(INTERSTITIAL_UNIT_ID);

    // Create ad request.
    AdRequest adRequest2 = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
            .addTestDevice(deviceId)
            .build();

    // Begin loading interstitial.
    interstitial.loadAd(adRequest2);
}

@Override
public void onPause() {
    super.onPause();
    displayInterstitial();
}


public void displayInterstitial() {
    if (interstitial.isLoaded() && System.currentTimeMillis() >= lastInterstitial + timeLag * 1000) {
        lastInterstitial = System.currentTimeMillis();
        interstitial.show();
    }
}

我是这样使用它的:

public class ActivityA extends AdActivity{ //...
} 
3个回答

5

好的,我似乎通过更改解决了它

interstitial = new InterstitialAd(this);

to

interstitial = new InterstitialAd(getApplicationContext());

我不完全理解Java/Android中的内存管理,但我认为发生的情况是因为Activity引用了插屏广告(interstitial),而插屏广告(interstitial)也引用了Activity,所以两者都没有被垃圾回收。传递应用程序上下文(application context)而不是Activity上下文(context)可以避免这种循环依赖关系并解决问题。希望这能帮助有需要的人:D。


0

有一件事情帮助了我,那就是在UI线程上调用interstitial.show()方法(因为我猜测这是UI相关的操作,必须在UI线程上执行)。


0

只需使用应用程序全局上下文:

interstitial = new InterstitialAd(getApplication());

不要使用getApplicationContext(),因为返回的值将是您当前的活动。


没有任何区别,你可以从内存管理中检查它。 - Berkay Turancı

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接