我正在使用 Google Admob SDK v6.1.0 (https://developers.google.com/mobile-ads-sdk/download),并以编程方式实例化 com.google.ads.AdView(不是 XML 格式),然后添加它动态地在我的 Activity 中放入 LinearLayout 中。
我的一位用户报告说,当他们在我的 Activity 中单击“主页”按钮(为了将其置于后台)时,他们开始看到我的应用程序的 CPU 使用率很高。我能够在 Jellybean 平台上重现这一点,并注意到高 CPU 使用率的来源是 WebViewCoreThread。
我的 Activity 根本不使用任何 WebView,但我能够逐步完成 Activity 的初始化,并注意到当我实例化 AdMob AdView 对象时,此 WebViewCoreThread 启动。正如 AdMob 参考文献中所述,我在 Activity 的 onDestroy() 方法中对此 AdView 调用 destroy() 。我也更改了代码以在 onPause() 方法中调用 AdView.onDestroy() 。但似乎没有什么导致 WebViewCoreThread 停止。我想,如果那根线一直存在的话我就没事了。但是,如果我一遍又一遍地多次启动 Activity,该线程就会开始使用 CPU 的 8% 到 25%,即使我的 Activity 不在前台。
我注意到其他一些用户说您必须调用 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 的创建和销毁。我在活动的初始化中调用此类的 getNewAd() 方法。我在 Activity 的 onPause() 和 onDestroy() 方法中调用此类的removeAd():
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;
}