Android 终结器引发的未捕获异常:必须在同一线程上调用所有WebView方法。(预期活套)
我正在使用Admob sdk 18.1.1 以及获取终结器引发的错误未捕获异常Android 终结器引发的未捕获异常:必须在同一线程上调用所有WebView方法。(预期活套),android,admob,Android,Admob,我正在使用Admob sdk 18.1.1 以及获取终结器引发的错误未捕获异常 java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'FinalizerDaemon'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {f4f671a} c
java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'FinalizerDaemon'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {f4f671a} called on null, FYI main Looper is Looper (main, tid 2) {f4f671a})
此问题是否发生在admob sdk内部
堆栈跟踪:
at android.webkit.WebView.checkThread(WebView.java:2732)
at android.webkit.WebView.evaluateJavascript(WebView.java:1128)
at com.google.android.gms.internal.ads.zzbbq.evaluateJavascript(com.google.android.gms:play-services-ads@@18.1.1:108)
at com.google.android.gms.internal.ads.zzbbq.zza(com.google.android.gms:play-services-ads@@18.1.1:144)
at com.google.android.gms.internal.ads.zzbbq.zzfk(com.google.android.gms:play-services-ads@@18.1.1:151)
at com.google.android.gms.internal.ads.zzbbq.zza(com.google.android.gms:play-services-ads@@18.1.1:190)
at com.google.android.gms.internal.ads.zzbbq.zza(com.google.android.gms:play-services-ads@@18.1.1:101)
at com.google.android.gms.internal.ads.zzbbq.zzav(com.google.android.gms:play-services-ads@@18.1.1:630)
at com.google.android.gms.internal.ads.zzbbq.onDetachedFromWindow(com.google.android.gms:play-services-ads@@18.1.1:434)
at android.view.View.dispatchDetachedFromWindow(View.java:18583)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3793)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3785)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:5375)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:5346)
at android.view.ViewGroup.removeView(ViewGroup.java:5277)
at com.google.android.gms.ads.internal.overlay.zze.onDestroy(com.google.android.gms:play-services-ads@@18.1.1:125)
at com.google.android.gms.internal.ads.zzbbq.destroy(com.google.android.gms:play-services-ads@@18.1.1:472)
at com.google.android.gms.internal.ads.zzbbo.destroy(com.google.android.gms:play-services-ads@@18.1.1:106)
at com.google.android.gms.internal.ads.zzbrc.finalize(com.google.android.gms:play-services-ads@@18.1.1:33)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:256)
at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:243)
at java.lang.Daemons$Daemon.run(Daemons.java:109)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.Throwable: A WebView method was called on thread 'FinalizerDaemon'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 2) {f4f671a} called on null, FYI main Looper is Looper (main, tid 2) {f4f671a})
操作系统:安卓7.1、8.0、8.1、9.0都收到了相同的错误日志这个问题主要是因为你使用了间隙广告。因为我也遇到了同样的问题,谷歌拒绝了我对应用程序的任何更新,直到我“修复”了这个问题 这里的问题是,当你点击home(主页)按钮退出应用程序时,插播广告也会尝试加载 因此,当你离开应用程序时,你必须阻止加载广告 你可以试试这个(我所做的): 在activiy/fragment中创建一个字段变量,如
private boolean shouldloadds
在onCreate()中,您可以初始化填隙文件:
mInterstitialAd = new InterstitialAd(this);
mInterstitialAd .setAdUnitId(getString(R.string.adview_interstitial));
mInterstitialAd .loadAd(new AdRequest.Builder().build());
当你调用中间层来显示它时,你是这样做的:
if(mInterstitialAd != null && mInterstitialAd .isLoaded()) {
mInterstitialAd .show();
mInterstitialAd .setAdListener(new AdListener(){
@Override
public void onAdClosed() {
super.onAdClosed();
if(shouldLoadAds) { //load the ad only if shouldLoadAds == true
mInterstitialAd .loadAd(new AdRequest.Builder().build());
}
//here some code, what should be done, after the ads is cloded
}
});
}
@Override
public void onStart() {
super.onStart();
shouldLoadAds= true;
}
@Override
public void onStop() {
shouldLoadAds= false;
super.onStop();
}
然后您必须像这样覆盖onStart()
和onStop()
:
if(mInterstitialAd != null && mInterstitialAd .isLoaded()) {
mInterstitialAd .show();
mInterstitialAd .setAdListener(new AdListener(){
@Override
public void onAdClosed() {
super.onAdClosed();
if(shouldLoadAds) { //load the ad only if shouldLoadAds == true
mInterstitialAd .loadAd(new AdRequest.Builder().build());
}
//here some code, what should be done, after the ads is cloded
}
});
}
@Override
public void onStart() {
super.onStart();
shouldLoadAds= true;
}
@Override
public void onStop() {
shouldLoadAds= false;
super.onStop();
}
在线程“FinalizerDaemon”上调用了WebView方法,请不要在单独的线程中调用。在同一线程内调用并检查。