Я использую Google Admob SDK v6.1.0 (https://developers.google.com/mobile-ads-sdk/download), создаю экземпляр com.google.ads.AdView программно (не в XML) и добавляю его в LinearLayout, динамически в моей деятельности.
Один из моих пользователей сообщил, что когда они нажимают кнопку «Домой» во время моей активности (чтобы сделать ее фоновой), они начинают видеть высокую загрузку ЦП, связанную с моим приложением. Я смог воспроизвести это на платформе Jellybean и заметил, что источником высокой загрузки ЦП был WebViewCoreThread.
Моя активность вообще не использует никаких веб-представлений, но я смог выполнить инициализацию своей активности и заметил, что этот WebViewCoreThread запускается, когда я создаю экземпляр объекта AdMob AdView. Как указано в ссылках AdMob, я вызываю destroy() для этого AdView в методе onDestroy() моей Activity. И я также изменил свой код, чтобы вызвать AdView.onDestroy() в моем методе onPause(). Но, похоже, ничто не приводит к остановке WebViewCoreThread. Я думаю, я в порядке, если эта нить останется. Но если я запускаю свою активность несколько раз снова и снова, этот поток начинает использовать где-то от 8 до 25% моего ЦП, даже моя активность не находится на переднем плане.
Я заметил, что несколько других пользователей говорят, что вы должны вызвать WebView.onPause() в качестве корректирующего действия. (http://stackoverflow.com/questions/2040963/webview-threads-never-stop-webviewcorethread-cookiesyncmanager-http0-3) Но это невозможно для меня напрямую, поскольку мое веб-представление создается AdView AdMob. Я также изменил свой код, чтобы вызвать .removeAllViews() для объекта LinearLayout контейнера Admob AdView mt, а затем вызвать System.gc() для принудительной сборки мусора, но, похоже, ничто не убивает мой WebViewCoreThread, и в конце концов он начинает потреблять ЦП, пока я не принудительно -убить процесс моего приложения.
Любые подсказки, почему AdMob делает это, и как я могу принудительно убить этот поток?
Я прикрепляю созданный мной класс для инкапсуляции создания и уничтожения AdView. Я вызываю метод getNewAd() этого класса при инициализации моей активности. И я вызываю метод removeAd() этого класса в методах onPause() и onDestroy() моей Activity:
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;
}