我使用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