Google Admob SDK v6.1.0 (https://developers.google.com/mobile-ads-sdk/download)을 사용하고 있습니다. 프로그래밍 방식으로 com.google.ads.AdView를 인스턴스화하고 (XML이 아닌) 내 Activity에서 동적으로 LinearLayout에 추가합니다.admView에서 사용하는 WebViewCoreThread 상위 활동이 일시 중지 된 경우에도 AdView가 높은 CPU를 사용합니다.
사용자 중 한 명이 내 활동 (배경 사용) 중에 '홈'버튼을 클릭하면 내 응용 프로그램에서 높은 CPU 사용량이 발생하는 것으로 나타났습니다. 나는 Jellybean 플랫폼에서 이것을 재현 할 수 있었고 CPU 사용량이 많은 소스가 WebViewCoreThread라는 것을 알게되었습니다.
내 활동에 WebView가 전혀 사용되지 않았지만 활동의 초기화를 단계별로 수행 할 수 있었으며 AdMob AdView 객체를 인스턴스화 할 때이 WebViewCoreThread가 시작된다는 사실을 알게되었습니다. AdMob의 참조 상태로,이 AdView에서 내 Activity의 onDestroy() 메소드에서 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에 의해 만들어지기 때문에 이것이 가능하지 않습니다. 또한 Admob AdView의 컨테이너 LinearLayout 객체에 대해 .removeAllViews()를 호출 한 다음 가비지 수집을 강제 실행하기 위해 System.gc()를 호출했지만 내 WebViewCoreThread를 죽이는 것으로 보이지 않으며 결국 강제로 종료 될 때까지 CPU를 먹기 시작합니다. 내 애플 리케이션의 프로세스를 죽일.
AdMob에서이 작업을 수행하는 단서와 내가이 스레드를 강제로 강제 종료 할 수있는 방법은 무엇입니까?
AdView 생성 및 삭제를 캡슐화하기 위해 만든 클래스를 첨부하고 있습니다. 내 활동 초기화에서이 클래스의 getNewAd() 메소드를 호출한다. 그리고 내가) (내 활동의 onPause() 및들의 OnDestroy에서 방법이 클래스의 removeAd()를 호출 다음 몹의 AdView가 객체에() 파괴 호출 한 후
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 AdView 객체에서 destroy()를 호출 한 후, 이제 null에 대한 참조를 설정했습니다. 이는 AdView에 대한 모든 참조를 제거하여 가비지 수집을 유발하여 모든 WebViewCoreThread가 무기한 실행되는 것을 방지합니다. 전반적으로이 방법은 마음에 들지 않습니다. 이러한 정리 작업은 AdMob 파괴 내에서 처리되어야합니다. 또는 실제로, 나는 destroy()를 호출 할 필요조차 없다. 내 활동을 멈 춥니 다. – Shiprack