在线程 'FinalizerDaemon' 上调用了 WebView 方法,但我的应用程序没有 WEBVIEW

A WebView method was called on thread 'FinalizerDaemon' BUT MY APP HAS NO WEBVIEW

我在开发我的应用程序时使用 StrictMode 策略:

  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                    .detectLeakedSqlLiteObjects()
                    .detectLeakedClosableObjects()
                    .penaltyLog()
                    .penaltyDeath()
                    .build());

我遇到了一种新型的崩溃,似乎无处出现:

W/WebView: 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) {7424b6e} called on null, FYI main Looper is Looper (main, tid 2) {7424b6e})
    at android.webkit.WebView.checkThread(WebView.java:2695)
    at android.webkit.WebView.loadUrl(WebView.java:969)
    at com.google.android.gms.ads.internal.webview.v.e(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:1)
    at com.google.android.gms.ads.internal.webview.v.destroy(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:9)
    at com.google.android.gms.ads.internal.webview.t.destroy(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:10)
    at com.google.android.gms.ads.nonagon.ad.interstitial.b.finalize(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:2)
    at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:252)
        at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:239)
        at java.lang.Daemons$Daemon.run(Daemons.java:105)
        at java.lang.Thread.run(Thread.java:764)


2019-06-17 15:25:59.035 31170-31180/hu.myapp.name D/StrictMode: StrictMode policy violation: android.os.strictmode.WebViewMethodCalledOnWrongThreadViolation
        at android.webkit.WebView.checkThread(WebView.java:2695)
        at android.webkit.WebView.loadUrl(WebView.java:969)
        at com.google.android.gms.ads.internal.webview.v.e(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:1)
        at com.google.android.gms.ads.internal.webview.v.destroy(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:9)
        at com.google.android.gms.ads.internal.webview.t.destroy(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:10)
        at com.google.android.gms.ads.nonagon.ad.interstitial.b.finalize(:com.google.android.gms.policy_ads_fdr_dynamite@20290004@20290004.249178941.249178941:2)
        at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:252)
        at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:239)
        at java.lang.Daemons$Daemon.run(Daemons.java:105)
        at java.lang.Thread.run(Thread.java:764)

我的应用程序没有任何网络视图,这就是为什么这很奇怪。

这真的很烦人,崩溃不包括我的任何代码行,只有 android 和 google 包。

有什么想法吗?

显然您使用的是 in-app 广告 SDK,它使用 WebView(Admob?)参见 com.google.android.gms.ads.internal.webview...

此外,根据我使用 WebViewStrictMode 的经验,您出现这种行为可能不是 Ads SDK 的错误:我的应用程序必须禁用一些检查(或减少对日志的惩罚)以解决问题(我们确实使用 WebView,并且 WebView 本身会造成 StrictMode 的问题,因为磁盘访问是从 UI 线程和类似问题)。

我对 admob 也有同样的问题。

这是我重现崩溃的方法:

  • 当我的 activity 打开时,我加载了插页式广告 -> interstitial.loadAd(adRequest);
  • 但是根据用户操作的一些设计原因,我不需要这个插页式广告,因为我永远不会显示它。
  • 用户操作打开另一个 activity 并销毁包含插页式广告的那个

-> 如果用户在插播广告完全加载时打开这个新的 activity,我没有任何问题。

-> 如果用户在 intertial 完全加载之前打开这个新的 activity,则会发生崩溃。当然是因为当插页式芬兰语下载其数据时,它会初始化一个 webview。但是,由于中间变量已经到达垃圾收集器...

所以解决方案是必须取消插页式请求,但我发现无能为力...

不太确定如何解决我的问题。我不想等待加载结束来响应用户操作。我也不能延迟或忽略插页式广告的加载,假设用户将执行什么操作...

很抱歉重新激活此 post,但在我看来是同样的问题。我没有提供解决方案,但至少提供了重现崩溃的确切方法。如果admob的人来这里,请添加一个方法来取消处理加载