【问题标题】:Uncaught exception thrown by finalizer: All WebView methods must be called on the same thread. (Expected Looper )终结器抛出未捕获的异常:必须在同一个线程上调用所有 WebView 方法。 (预期的活套)
【发布时间】:2019-07-29 10:31:05
【问题描述】:

我正在使用 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})

操作系统:Android 7.1、8.0、8.1、9.0 得到相同的错误日志

【问题讨论】:

  • 在线程“FinalizerDaemon”上调用了 WebView 方法,不要在单独的线程中调用。在同一个线程中调用并检查。

标签: android admob


【解决方案1】:

这个问题主要是因为您使用的是插页式广告。因为我有同样的问题,谷歌拒绝了我为应用程序所做的任何更新,直到我“修复”了这个问题。

这里的问题是,当您点击主页按钮退出应用程序时,插页式广告也会尝试加载。

所以当你离开应用程序时,你必须阻止广告加载。

你可以试试这个(我做了什么):

在您的活动/片段中创建一个字段变量,例如 private boolean shouldLoadAds;

在您的 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
                }
            });
        }

那么你必须像这样覆盖onStart()onStop()

@Override
    public void onStart() {
        super.onStart();
        shouldLoadAds= true;
    }

    @Override
    public void onStop() {
        shouldLoadAds= false;
        super.onStop();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多