私は Google Admob SDK v6.1.0 (https://developers.google.com/mobile-ads-sdk/download) を使用しており、プログラムで (XML ではなく) com.google.ads.AdView をインスタンス化し、追加します。アクティビティで動的に LinearLayout に変換します。
私のユーザーの 1 人が、アクティビティ中に (バックグラウンドにするために) ホーム ボタンをクリックすると、アプリの CPU 使用率が高くなり始めると報告しました。これを Jellybean プラットフォームで再現できたのですが、CPU 使用率が高い原因は WebViewCoreThread であることがわかりました。
私のアクティビティは WebView をまったく使用していませんが、アクティビティの初期化を進めることができ、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)しかし、私の Web ビューは 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;
}