我正在使用 Google Admob SDK v6.1.0 (https://developers.google.com/mobile-ads-sdk/download),并以编程方式(不在 XML 中)实例化 com.google.ads.AdView,并添加在我的 Activity 中动态地将它变成一个 LinearLayout。
我的一位用户报告说,当他们在我的 Activity 中单击 Home 按钮时(为了将其设置为背景),他们开始看到来自我的应用程序的高 CPU 使用率。我能够在 Jellybean 平台上重现这一点,并注意到高 CPU 使用率的来源是 WebViewCoreThread。
我的 Activity 根本不使用任何 WebView,但我能够逐步完成 Activity 的初始化,并注意到当我实例化 AdMob AdView 对象时,此 WebViewCoreThread 启动。正如 AdMob 引用中的状态,我在我的 Activity 的 onDestroy() 方法中对这个 AdView 调用了 destroy()。我也更改了我的代码,在我的 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 创建和销毁。我在我的活动初始化中调用了这个类的 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;
}