Android 终结器引发的未捕获异常:必须在同一线程上调用所有WebView方法。(预期活套)

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

我正在使用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} 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方法,请不要在单独的线程中调用。在同一线程内调用并检查。