本教程将介绍即使父 Activity 暂停,admob AdView 使用的 WebViewCoreThread 也在使用高 CPU的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
我正在使用 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;
}
推荐答案
不确定是否还有人需要此信息,但我自己一直在寻找解决方案.显然 AdMob 仍然存在缺陷.
唯一的问题是,这将阻止所有 WebView 在后台运行.仅当您的应用依赖此操作时才会出现问题.
添加到 onPause()
:
new WebView(this).pauseTimers();
和 onResume()
:
new WebView(this).resumeTimers();
这来自一位声称正在调查的 Google 员工:https://groups.google.com/d/msg/google-admob-ads-sdk/Qu4G19NFAuI/wcNkoV0AeDUJ
好了关于即使父 Activity 暂停,admob AdView 使用的 WebViewCoreThread 也在使用高 CPU的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。