【问题标题】:A WebView method was called on thread 'FinalizerDaemon' BUT MY APP HAS NO WEBVIEW在线程“FinalizerDaemon”上调用了 WebView 方法,但我的应用程序没有 WEBVIEW
【发布时间】:2023-03-25 03:24:02
【问题描述】:

我在开发应用时使用 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 包。

有什么想法吗?

【问题讨论】:

  • 显然您正在使用使用 WebView(Admob?)的应用内广告 SDK,请参阅 com.google.android.gms.ads.internal.webview...
  • 您的应用可能没有,但 admob SDK 是。您是否尝试过使用其他版本,以防这是 ​​SDK 中的错误?
  • 根据我使用 WebView 和 StrictMode 的经验,这可能不是错误。在我们的应用中,我们必须禁用一些检查(或减少对日志的惩罚)才能解决问题。
  • 转向答案,因为这似乎是对您所遇到的行为的更合理的解释。

标签: android android-webview android-strictmode


【解决方案1】:

显然,您正在使用使用 WebView(Admob?)的应用内广告 SDK,请参阅 com.google.android.gms.ads.internal.webview...

另外,根据我使用 WebViewStrictMode 的经验,您遇到这种行为的事实可能不是 Ads SDK 的错误:在我们的应用中,我们必须禁用一些检查(或减少惩罚)记录)以解决该问题(我们确实使用WebView,而WebView 本身会产生StrictMode 的问题,因为从 UI 线程完成磁盘访问和类似问题)。

【讨论】:

  • 真正的问题/烦人的部分是我确实集成了 AdMob,但在调试模式下我不显示任何广告。使用严格模式时,我的应用程序中看不到 NONE webViews。我会说这是一个错误。
  • 然后,是的,无论您是否显示 WebView,它看起来都在创建,所以这很可能是 AdMob SDK 上的错误。
【解决方案2】:

我对 admob 也有同样的问题。

这是我重现崩溃的方法:

  • 当我的活动打开时,我会加载一个插页式广告 -> interstitial.loadAd(adRequest);
  • 但某些设计原因取决于用户操作,我不需要此插页式广告,因为我永远不会显示它。
  • 用户操作打开另一个活动并销毁包含插页式广告的活动

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

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

所以解决方案是不得不取消插页式请求,但我发现没有办法这样做......

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

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

【讨论】:

  • 所以我保留我的设计并获得我想要的行为的解决方案是将插页式广告实现为单例并添加一个销毁方法。如果插页式广告加载完毕,我会销毁我的单身人士。不是完美的解决方案,因为我继续在后台加载一些我知道我永远不会使用的东西......非常疯狂,他们没有想到添加取消请求方法......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多