Intereting Posts
Как реализовать CustomView с пользовательскими состояниями выбора? Любой простой или простой способ отладки кода Android NDK? Декодирование MP3 на Android Android View.OnKeyListener: нажмите один раз, выполните дважды Showroid () не работает Я установил use-feature android: required = "false", но игра Google продолжает настаивать на этих функциях Ошибка AppCompatDialogFragment с помощью appcompat-v7: 23.1.0 Чтение уведомлений с использованием AccessibilityService Eclipse Android Debugger – Где в моем коде я вызывал исключение? Как WhatsApp преодолевает задержку уведомлений GCM Push? Как запретить «Громкую музыку может нанести вред вашему слуху …» предупреждение в Android Предварительный просмотр Android Studio Designer не показывает правильные размеры Java.lang.NumberFormatException: Недопустимый int: "" Почему моя служба не работает в Android? (Я просто хочу, чтобы что-то регистрировалось каждые 5 секунд) Советы по организации крупных проектов Android?

Android AdMob вызывает утечку памяти?

Я включил AdMob v4.1.0 в свое приложение и, похоже, вызвал огромную утечку памяти (довольно уверен, что это уже произошло в версии 4.0.4).

Чтобы изолировать проблему, я создал новый проект с пустым линейным макетом и добавил к нему AdView (на самом деле это копия и вставка из кода примера, предоставленного AdMob). См. Мой файл main.xml, MainActivity.java и манифеста:

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); } } 

проявляются:

 <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, и действие прекращается, НО проблема в том, что он никогда не будет доступен для GC, поскольку он заставляет InputMethodManager содержать ссылку на Activity (см. Изображение, полученное с выхода HPROF после уничтожения активности): MainActivity Объедините самый короткий путь к GC Roots

После удаления кода, связанного с AdView (и опять же, это ТОЛЬКО код этого приложения) проблема исчезает: Тот же выход HPROF без использования AdView

EDIT: Также попытался удалить ВСЕ код из 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> 

Есть идеи ????

Solutions Collecting From Web of "Android AdMob вызывает утечку памяти?"

Вот моя работа для этого беспорядка:

Я ограничил утечку памяти, используя тот же пустой экземпляр активности:

 public final class AdMobActivity extends Activity { public static AdMobActivity AdMobMemoryLeakWorkAroundActivity; public AdMobActivity() { super(); if (AdMobMemoryLeakWorkAroundActivity != null) throw new IllegalStateException("This activity should be created only once during the entire application life"); AdMobMemoryLeakWorkAroundActivity = this; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); finish(); } public static final void startAdMobActivity(Activity activity) { Intent i = new Intent(); i.setComponent(new ComponentName(activity.getApplicationContext(), AdMobActivity.class)); activity.startActivity(i); } } 

Дальнейшее объявление будет создано с помощью AdMobActivity.AdMobMemoryLeakWorkAroundActivity .

Вам также необходимо добавить активность к манифесту, конечно:

 <activity android:launchMode="singleInstance" android:name="com.nu.art.software.android.modules.admob.AdMobActivity" /> 

Эта реализация противоречит моим убеждениям относительно статических ссылок, которые не являются константами, но эта реализация предотвращает утечку, потому что для создания всех объявлений используется только один экземпляр активности, и поэтому больше не происходит утечки активности, а также тот факт, что активность полностью пуста ,

ПРИМЕЧАНИЕ. Вы должны вызвать метод startAdMobActivity из основного действия приложения onCreate .

Адам.

ОБНОВИТЬ

Это решение работает только при динамическом создании объявления и добавлении его в макет с кодом … и не забудьте его уничтожить в Activity.onDestroy ().

Я использую «play-services-ads: 7.5.0», и не было необходимости создавать AdMobActivity. Он работал:

Создание adView динамически

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

Удаление всех видов из линейногоLayout для уничтожения и уничтожения adView

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

К сожалению, Interstitial все еще протекает

Один из способов устранить эту проблему – создать один экземпляр рекламного объявления, используя базовую активность вашего приложения. Добавьте этот рекламный код в любое действие, которое вы хотите, но не забудьте удалить его в действие по методу destroy.

Таким образом, реклама только теряет базовую активность, к которой у вас почти никогда не должно быть более одного экземпляра.

Пример:

 @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.venue); mainLayout = (LinearLayout) findViewById(R.id.venueLayout); adview = StaticStateClass.getAdview(); AdRequest request = new AdRequest(); request.addKeyword(name); mainLayout.addView(adview); adview.loadAd(request); } @Override public void onDestroy() { mainLayout.removeView(adview); super.onDestroy(); } 

Я столкнулся с той же проблемой. Единственное, что мне помогло – это System.exit (0). Мне это не нравится, но это единственный способ, который я нашел.
AdMob просто остается в RAM 4ever и не позволяет моему приложению закончить правильно. Когда я перезагружаю приложение, ОС просто поднимает это приложение нежити, и вскоре он вызывает исключение из памяти.
Моя тема форума поддержки AdMob – пока не поддерживается. Похож на no1 заботы.

Я узнал, что зов: –

 mAdView.destroy(); 

Перед тем как покинуть мероприятие, решает утечку для меня.

Вот как я объявляю баннерную рекламу в xml: –

  <com.google.android.gms.ads.AdView android:id="@+id/adView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal|bottom" ads:adSize="BANNER" ads:adUnitId="@string/banner_ad_unit_id_2" /> 

Получите ссылку на баннер admob в onCreate (): –

 mAdView = (AdView) findViewById(R.id.adView2); AdRequest banneradRequest = new AdRequest.Builder().build(); mAdView.loadAd(banneradRequest); 

И уничтожить его в ondestroy () деятельности: –

 @Override protected void onDestroy() { super.onDestroy(); mAdView.destroy(); } 

Другой ответ, который решает эту проблему, хотя это больно, заключается в следующем:

  • Отменить все данные, которые необходимы от sharedPreferences или любых других типов хранения,
    Хранить эти значения в локальных переменных / объектах

  • ПРОСМОТР ВСЕХ ВАШИХ ПРИЛОЖЕНИЙ

  • Повторять все

Вы можете начать сервис, когда ваше приложение закрывается, чтобы сделать это. Это предотвратит получение данных из-за утечки памяти. Неприятный способ справиться с этим, но я попробовал, и он работает.

Donot объединить ваш интерфейс с Admob, вы можете запустить другой поток, чтобы получить объявление от Admob. Также вы можете обновить объявление в определенный промежуток времени. Это будет проще для вас отладки, где может быть проблема с памятью.

Благодарю Дипака

В принципе, это не проблема. То, что происходит, – это ваша деятельность, получающая onDestroy, ее очистка, а затем ожидание работы GC. Когда GC происходит, он видит, что этот старый контекст лежит вокруг и очищает весь базовый гнус, но, похоже, он не очищает активность в этом проходе – вот почему ваша «пропущенная» активность имеет такой небольшой след: это В основном оболочкой. На следующем проходе GC он будет очищен.

Вы сами можете это увидеть, активировав свою деятельность, отступив (чтобы запустить onDestroy), возвращаясь к процессу, включив GC и дамп hprof, немного подождав, а затем запустив другой свалку GC и hprof. На первой дампе – по крайней мере, на моих тестах – я видел результаты, похожие на ваши: дополнительная активность лежала с очень небольшим объемом памяти. Во второй дампе я видел только текущую активность.