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

时间:2019-06-17 13:30:32

标签: android android-webview android-strictmode

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

另外,根据我对WebViewStrictMode的经验,您可能会遇到这种情况,这可能不是Ads SDK的错误:我的应用程序必须禁用一些检查(或减少日志记录的损失)以解决问题(我们确实使用WebView,并且WebView本身由于StrictMode造成了问题,因为UI线程和类似操作完成了磁盘访问问题)。

答案 1 :(得分:0)

我对admob也有同样的问题。

这是我重现崩溃的方法:

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

->如果在空间加载完毕后用户打开此新活动,那么我没有任何问题。

->如果用户在完全加载Intertial之前打开此新活动,则会发生崩溃。肯定是因为插页式广告在下载其数据时会初始化一个Web视图。但是自那以后,instantitial变量已经到达了垃圾收集器...

所以解决方案是必须取消交互请求,但是我什么也没做...

不太确定如何解决我的问题。我不想等待加载结束以响应用户操作。我既不能延迟也不能忽略插页式广告的加载,前提是用户将要执行的操作...

很抱歉重新激活此帖子,但在我看来还是同样的问题。我没有给出解决方案,但至少给出了重现崩溃的确切方法。如果来自admob的人来了,请添加一种取消处理加载的方法