我使用Google Admob SDK v6.1.0(https://developers.google.com/mobile-ads-sdk/download)和我以編程方式(不是以XML格式)實例化com.google.ads.AdView,並在我的Activity中動態地將其添加到LinearLayout中。admob使用的WebViewCoreThread即使在父活動暫停時,AdView仍在使用高CPU
我的一位用戶報告說,當他們在我的活動中點擊主頁按鈕時(他們爲了背景),他們開始看到來自我的應用程序的高CPU使用率。我能夠在Jellybean平臺上重現這一點,並注意到高CPU使用率的來源是WebViewCoreThread。
我的活動根本沒有使用任何WebViews,但我能夠完成我的Activity的初始化,並且注意到當我實例化AdMob AdView對象時,此WebViewCoreThread啓動。作爲AdMob參考文獻中的狀態,我在Activity的onDestroy()方法中調用了此AdView上的destroy()。我aso更改我的代碼,以在我的onPause()方法中調用AdView.onDestroy()。但是沒有任何東西似乎導致WebViewCoreThread停止。我想,如果那條線路停留在附近,我很好。但是如果我一次又一次地開始我的活動,這個線程開始使用CPU的8%到25%之間的任何地方,即使我的活動不在前臺。
我注意到一些其他用戶說您必須調用WebView.onPause()作爲糾正措施。 (http://stackoverflow.com/questions/2040963/webview-threads-never-stop-webviewcorethread-cookiesyncmanager-http0-3)但是這對我來說不是直接可能的,因爲我的網絡視圖是由AdMob的AdView創建的。我還更改了我的代碼,以便爲mt Admob AdView的容器LinearLayout對象調用.removeAllViews(),然後調用System.gc()強制進行垃圾回收,但似乎沒有任何東西會殺死我的WebViewCoreThread,並最終開始吞噬CPU直到我強制 - 殺了我的應用程序的過程。
任何線索爲什麼AdMob這樣做,以及我如何強制這個線程被殺害?
我附上一個我創建的類來封裝AdView的創建和銷燬。我在我的activity的初始化中調用這個類的getNewAd()方法。我呼籲這個類的removeAd()在我的活動的的onPause()和的onDestroy()方法:
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;
}
我想我已經得到了這個工作,但我沒有添加這個作爲答案,因爲我還沒有完全相信,在admob AdView對象上調用destroy()之後,我現在將引用設置爲null ,它刪除了所有對AdView的引用,可能導致垃圾收集,從而避免任何WebViewCoreThreads無限期運行。總的來說,我不喜歡這種方法 - 這種清理工作應該在AdMob destroy中處理。或者實際上,我甚至不需要調用destroy() - 它讓我的活動停下來。 – Shiprack