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