gpt4 book ai didi

Android AdMob 导致内存泄漏?

转载 作者:IT王子 更新时间:2023-10-28 23:29:33 28 4
gpt4 key购买 nike

我已将 AdMob v4.1.0 集成到我的应用程序中,它似乎导致了巨大的内存泄漏(很确定它已经发生在 4.0.4 上)。

为了隔离问题,我创建了一个带有空白线性布局的新项目,并向其中添加了 AdView(这实际上是 AdMob 提供的示例代码的复制和粘贴)。查看我的 main.xml、MainActivity.java 和 list 内容:

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/linearLayout">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

MainActivity.java:

package AdsTry.main;

import com.google.ads.AdRequest;
import com.google.ads.AdSize;
import com.google.ads.AdView;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

private final int AD_VIEW_ID = 1000000;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// Lookup R.layout.main
LinearLayout layout = (LinearLayout)findViewById(R.id.linearLayout);

// Create the adView
// Please replace MY_BANNER_UNIT_ID with your AdMob Publisher ID
AdView adView = new AdView(this, AdSize.BANNER, "MY_BANNER_UNIT_ID");
adView.setId(AD_VIEW_ID);

// Add the adView to it
layout.addView(adView);

// Initiate a generic request to load it with an ad
AdRequest request = new AdRequest();

adView.loadAd(request);
}

@Override
protected void onPause() {
Log.i("AdsTry", "onPause");

getAdView().stopLoading();

super.onPause();
}

@Override
protected void onDestroy() {
Log.i("AdsTry", "onDestroy");

getAdView().destroy();

super.onDestroy();
}

private AdView getAdView()
{
return (AdView) findViewById(AD_VIEW_ID);
}
}

list :

<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<!-- AdMobActivity definition -->
<activity android:name="com.google.ads.AdActivity"
android:configChanges="orientation|keyboard|keyboardHidden" />
</application>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

这就是我拥有的所有代码。

现在,当运行这个应用程序时,我可以看到 onPause 和 onDestory 都被调用并且 Activity 被终止,但问题是它永远不会被 GC 使用,因为它导致 InputMethodManager 持有对 Activity (查看 Activity 被破坏后从 HPROF 输出中获取的图像): MainActivity Merge shortest path to GC Roots

一旦我删除了与 AdView 相关的代码(同样,这是此应用程序的唯一代码),问题就消失了: Same HPROF output without using AdView

编辑:还尝试从 onCreate 中删除所有代码并更新 main.xml 以包含以下内容(仍然得到相同的结果):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<com.google.ads.AdView
android:id="@+id/Ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ads:adUnitId="MY_ID"
ads:adSize="BANNER"
ads:loadAdOnCreate="true"/>
</LinearLayout>

有什么想法吗????

最佳答案

我正在使用“play-services-ads:7.5.0”,并且不需要创建 de AdMobActivity。它的工作原理是:

动态创建 adView

mAdView = new AdView(getApplicationContext(), AdSize.BANNER, banner_ad_unit_id); mAdsContainer.addView(mAdView);

在销毁和销毁 adView 时从 linearLayout 中删除所有 View

mAdView.setAdListener(null);
mAdsContainer.removeAllViews();
mAdView.destroy();

不幸的是,插页式广告仍然泄漏

关于Android AdMob 导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6148812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com