5

Ich habe Service, der eine Aktivität zu einem bestimmten Zeitpunkt zeigen wird, nach dieser Aktivität an jedem 13. Mal zeige ich eine Admob Interstitial-Anzeigen. Die RAM-Nutzung meiner Anwendung steigt um 20 MB, wenn die Interstitial-Anzeige angezeigt wird und danach keine Müllsammlung mehr erfasst wird. Beim nächsten 13. Mal, wenn andere Interstitial-Anzeigen angezeigt werden, gibt es keine Erhöhung des Dienstspeichers.Memory Leak bei der Verwendung von Admob Interstitial-Anzeigen

Mein Code für die Schaltung von Anzeigen:

public void loadAndShowInterstitialAd() { 
     interstitial = new InterstitialAd(getApplicationContext()); 
     interstitial.setAdUnitId(AD_UNIT_ID); 

     final AdRequest adRequest = new AdRequest.Builder() 
       .build(); 

     Handler handler = new Handler(new Handler.Callback() { 

      @Override 
      public boolean handleMessage(Message msg) { 
       interstitial.loadAd(adRequest); 
       return true; 
      } 
     }); 

     if (handler != null) { 
      handler.sendEmptyMessageDelayed(0, 200); 
     } 

     interstitial.setAdListener(new AdListener() { 
      @Override 
      public void onAdLoaded() { 
       super.onAdLoaded(); 
       displayInterstitial(); 
      } 

     }); 
    } 

    public void displayInterstitial() { 
     if (interstitial.isLoaded()) { 
      interstitial.show(); 
     } 
    } 

ich einige Lösungen in den folgenden Stack-Überlauf Fragen versucht, aber nichts für mich gearbeitet.

Android Admob Interstitial Memory leak

Android AdMob causes memory leak?

Antwort

2

Ich habe es geschafft, dieses Problem zu beheben, indem Sie die Ad-Aktivität in einem anderen Prozess ausgeführt wird. Ich nehme an, dass Android die Aktivitäten aus bestimmten Gründen länger im Prozess speichert, als es benötigt wird. Ich hoffe, es wird jemandem helfen, dieses Problem zu beheben.

+0

Haben Sie ein Beispiel? Ich versuche alles schon mit dem gleichen Problem, kann es aber nicht finden. Hast du dafür eine neue Klasse gemacht? – Riverside

+1

Verwenden Sie Android: Prozessattribut, um die Aktivitäten zu trennen, die in verschiedenen Prozessen ausgeführt werden. Das hat mein Problem gelöst. Verwenden Sie es passend für Ihr Projekt. – venkat

+0

Die Ausführung in einem anderen Prozess löst das Problem nicht für mich. – frankish

6

ich heute zu diesem Thema lief, schließlich habe ich eine fix: In Ihrer Tätigkeit in onDestroy():

  • Wenn es eine AdView ist, entfernen Sie sie von Ihrem Layout, das AdView auf null gesetzt .
  • Legen Sie alle AdListeners auf null fest.

    @Override 
        public void onDestroy(){ 
         super.onDestroy(); 
         mMainView.removeView(adView); 
         adView = null; 
         interstitial.setAdListener(null); 
        } 
    

    In Ihrem Fall möglicherweise AdListener auf Null gesetzt ist genug.

P/S:

Da Lecks in vielerlei Hinsicht geschehen, falls jemand verfehlt dies: Speichern Sie die Interstitial mit Context.getApplicationContext() (wie das, was OP tat) zu initialisieren, nicht durch Ihre Aktivität - was absolut ein Leck verursacht - weil Interstitial jetzt einen Verweis auf Ihre Aktivität zu halten scheint, und es nie verlässt, also lassen Sie Ihre Aktivität nie los ...

Interstitial interstitial = new Interstitial(getApplicationContext()) 
+0

Dies versucht, das Problem zu lösen, da es nicht mehr mehrere Instanzen der Aktivität gibt, von der das Interstitial gestartet wurde. Allerdings stimmt noch etwas nicht. Wenn man es über Nacht zum Sitzen und Laden von Anzeigen verlässt, sammelt es irgendwo noch Speicher. Ich denke, es ist ein Google SDK-Klasse, aber vielleicht ist der Fehler immer noch in der App irgendwo. – Sojurn

+0

Dies verhindert nicht, dass das AdActivity-Objekt leckt. Es wird mehrere Kopien von AdActivity mit jedem Interstitial geben ... – frankish

+0

@frankish Das ist die Seite von AdMob dieses Problems, wir haben keine Kontrolle über AdActivity. Meine Herangehensweise ist so hart wie wir können auf unserer Seite, wo wir die volle Kraft haben, jede unserer eigenen schriftlichen Aktivitäten. Wie steht es um dein Problem, ist es jetzt in Ordnung? – DuDu