2012-10-14 12 views
15

Google Admob SDK v6.1.0 (https://developers.google.com/mobile-ads-sdk/download) kullanıyorum ve com.google.ads.AdView uygulamasını programlı olarak (XML'de değil) gerçekleştirin ve etkinliğimde dinamik olarak bir LinearLayout'a ekleyin.WebViewCoreThread tarafından kullanılan adView AdView, Ebeveyn Etkinliği duraklatılmış olsa bile yüksek CPU kullanıyor

Kullanıcılarımdan biri, Etkinliğim sırasındayken Ana düğmeyi tıkladıklarında (arka planını yapmak için) uygulamanıza yüksek bir CPU kullanımı görmeye başladığını bildirdi. Bunu bir Jellybean platformunda yeniden üretebildim ve yüksek CPU kullanımı için kaynağın bir WebViewCoreThread olduğunu fark ettim.

Etkinliğim hiç WebView kullanmıyor, ancak Etkinliğimin başlatılmasını gerçekleştirebildim ve bu WebViewCoreThread'in AdMob AdView nesnesini başlattığımda başladığını fark ettim. AdMob'un referanslarındaki durum olarak, Etkinliğim onDestroy() yöntemimde bu Reklam Görünümü'nde destroy() öğesini çağırıyorum. Ve kodumu, onPause() yöntemimde AdView.onDestroy() öğesini çağırmak için değiştirdim. Ama hiçbir şey WebViewCoreThread durmasına neden gibi görünüyor. Sanırım, iş parçacığı etrafta dolaşıyorsa ben iyiyim. Ancak, Aktivitemi tekrar tekrar tekrar tekrar başlatırsam, bu iş parçacığı CPU'mn% 8 - 25'i arasında herhangi bir yerde kullanmaya başlar, hatta aktivitem ön planda değildir.

WebView.onPause() öğesini düzeltici eylem olarak çağırmanız gerektiğini söyleyen birkaç kullanıcı gördüm. (http://stackoverflow.com/questions/2040963/webview-threads-never-stop-webviewcorethread-cookiesyncmanager-http0-3) Ancak, web görünümüm AdMob AdView tarafından oluşturulduğundan, bu doğrudan benim için mümkün değil. Ayrıca, kodumuzu Admob AdView'ın konteyneri LinearLayout nesnesi için .removeAllViews() olarak çağırdım ve sonra çöp toplama işlemini zorlamak için System.gc() öğesini çağırıyorum, ancak WebViewCoreThread'i öldürecek hiçbir şey görünmüyor ve sonunda zorlanana kadar CPU'yu yemeye başlıyor. -Uygulamamın süreci.

AdMob'un bunu neden yaptığına dair ip uçları ve bu iş parçacığının öldürülmesini nasıl sağlayabilirim?

AdView oluşturma ve imhasını kapsüllemek için oluşturduğum bir sınıfı ekliyorum. Etkinliğin başlatılmasında bu sınıfın getNewAd() yöntemini arıyorum. Ve ben) (benim etkinlik'ın OnPause() ve OnDestroy yöntemleri bu sınıfının removeAd() diyoruz: admob Adview nesne üzerinde() yok etmek çağrıldıktan sonra

package com.shiprack.client; 

import com.google.ads.AdRequest; 
import com.google.ads.AdSize; 
import com.google.ads.AdView; 
import com.mobclix.android.sdk.Mobclix; 
import com.mobclix.android.sdk.MobclixMMABannerXLAdView; 

import android.app.Activity; 
import android.view.Gravity; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.LinearLayout; 

public class AdManager { 
    public AdManager(EventLog logger, LinearLayout container, Activity activity) { 
     _container = container; 
     _activity = activity; 
     _eventLogger = logger; 
    } 

    public void setNetwork(int network) { 
     _network = network; 
    } 

    public void getNewAd() { 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); 
     params.gravity = Gravity.CENTER; 
     switch (_network) { 
      case TrackDatabase.AD_NETWORK_ADMOB: { 
       _admobBanner = new AdView(_activity, AdSize.BANNER, "a14dc419375634c"); 
       _container.addView(_admobBanner, params); 
       _admobBanner.loadAd(new AdRequest()); 
       break; 
      } 
      case TrackDatabase.AD_NETWORK_MOBCLIX: { 
       Mobclix.onCreate(_activity); 
       _mobclixBanner = new MobclixMMABannerXLAdView(_activity); 
       _container.addView(_mobclixBanner, params); 
       _mobclixBanner.getAd(); 
       break; 
      } 
     } 
    } 

    public void removeAd() { 
     switch (_network) { 
      case TrackDatabase.AD_NETWORK_ADMOB: { 
       _admobBanner.destroy(); 
       break; 
      } 
      case TrackDatabase.AD_NETWORK_MOBCLIX: { 
       _mobclixBanner.cancelAd(); 
       break; 
      } 
     } 
     _container.removeAllViews(); 
    } 

    private EventLog _eventLogger; 
    private LinearLayout _container; 
    private Activity _activity; 
    private AdView _admobBanner; 
    private MobclixMMABannerXLAdView _mobclixBanner; 
    private int _network; 
} 
+0

Sanırım bu işe yarıyor, ama bunu bir cevap olarak eklemiyorum çünkü henüz tamamen ikna olmadım.Admob AdView nesnesinde destroy() çağırdıktan sonra, şimdi null referansını ayarladım AdView'a yapılan tüm referansları kaldırarak, belki de toplanıp çöp toplanmasını ve dolayısıyla WebViewCoreThreads'ın süresiz olarak çalışmasını engellemek için genel olarak bu yaklaşımdan hoşlanmamayı tercih ediyorum. Bu kadar temiz bir çalışma, AdMob imhasında ele alınmalıdır. Veya aslında, yok etmek zorunda olmamam gerekir() - o s aktivitemizi azaltıyor. – Shiprack

cevap

3

, şimdi tüm referansları kaldırır başvuruyu null, set AdView, belki de toplanan çöp almak için neden olur ve böylece, herhangi bir WebViewCoreThreads süresiz olarak çalışıyor kaçınarak. Genel olarak, bu yaklaşımı sevmiyorum - bu kadar temiz iş AdMob imha içinde ele alınmalıdır. Ya da aslında, destroy() 'ı çağırmamalıyım bile.

Büyük de olsa olumsuz: Kullanıcılarım, uygulamasındaki arka veya ana düğmelere bastığımda yavaşlıktan şikayet ediyor. Açıkçası, bu admob destroy() çağırırken onPause() yönteminde harcanan zaman nedeniyle. Uzun vadeli çözüm, Fragments ve ActionBar'ı kullanmak ve Admob banner'ının birden fazla kopyasını yaratmak zorunda değildir (her etkinlikte bir tane)

+0

Belki bir iş parçacığında admob yok etmeyin? – stu

10

Kimsenin bu bilgiye hala ihtiyacı olup olmadığından emin değilim, fakat bir çözüm aramaya başladım bu kendime. Görünüşe göre AdMob hala hatalı. Tek sorun, tüm WebView'ların arka planda çalışmasını engelleyecektir. Uygulamanızın kullanımına bağlı olarak yalnızca bir sorun.

onPause() ekle:

new WebView(this).pauseTimers(); 

ve onResume() için:

new WebView(this).resumeTimers(); 

Bu da onun içine arıyoruz iddia bir Google Çalışan geldi: https://groups.google.com/d/msg/google-admob-ads-sdk/Qu4G19NFAuI/wcNkoV0AeDUJ

+0

Teşekkürler! Bunu deneyeceğim. – Shiprack

+0

Umut eder. Benim için harikalar yarattı ama AdView.pause() 'ın gerektiği gibi çalıştığı daha iyi olurdu. –

+0

Bu, AdMob'un (Google oyun hizmetlerinde bulunan) yeni sürümü için doğru çözümdür (ve benim için çalışan tek çözüm). – Szymon

3

PZolee yayınlanan Bu konu ve blogunda önerilen bir çözüm: https://pzoleeblogen.wordpress.com/2014/07/08/android-how-to-solve-adview-cpu-consuming/ ben daha bu araştırdık (blog yayınına yorumlarında benim mücadeleler belgelenmiştir) ve aşağıdaki sonuca vardık: çağıran Nitekim

  1. sadece adView.pause(); Uygulama arka planda ve reklamlar görünmese bile Google Reklamları bileşeninin CPU'yu tüketmesini durdurmaz.
  2. Reklamımızdaki tüm WebView'leri bulma ve onPhause on() ve onResume() WevView yöntemlerini çağırmak gereksiz CPU tüketimi sorununu çözmez.
  3. Yukarıdaki post önerilerinin yazarı olarak WebView pauseTimers() ve resumeTimers() yöntemlerine yapılan çağrı, gereksiz CPU tüketimini durdurur. , Tüm düzen ayrıştırma ve tüm WebViews için JavaScript zamanlayıcılar -
  4. hepsinde pauseTimers() ve resumeTimers() ardışık tüm WebView'ları bulma ve arama böyle bir çağrı “Duraklatmalar (g. Ya devam) beri, gereksizdir. (bir süreç içinde - g.) ”- WebView bileşen dokümanlarına bakınız.
  5. Uygulamanızda başka herhangi bir yerde bir Web Görünümü kullanıyorsanız - belki başka etkinliklerde, bunun için bir süredir. Bunun için TIMERS() özelliğini kullanmaya devam etmelisiniz veya doğru şekilde çalışmayacaktır. Ayrıca, bir WevView'ın projenizde kullandığınız bazı kütüphane işlevleri tarafından geçici olarak inşa edilebileceğini ve açıkça bilmeden kullanabileceğinizi unutmayın. Örneğin, Bazı web sitelerine, sosyal ağlara giriş yapmak için bir bilgi istemi. Böyle bir WebView, eğer bir ara işleminizde pauseTimers() çağrıldıysa ve siz bunları devam ettirmediyseniz tekrar çalışmayabilir. KULLANIM İKAZLARINI VE TESTİ KULLANABİLİRSİNİZ. Google ve AdMob kendi API çağrısı ile (sabit CPU tüketimi sen bile (durdurmak, onların bileşeni uygulaması gizlemek arka plan bile) o reklam bileşeni ile bize böyle kötü bir sürpriz ele o

Gerçekten utanç verici, …

İlgili konular