首页 > Web开发 > 详细

[Crash修复方案]WebView中BadTokenException

时间:2015-11-20 16:46:59      阅读:692      评论:0      收藏:0      [点我收藏+]

1.背景

贴吧Crash平台中,收到了大量由于WebView中由于Window Token失效问题导致的Crash.

2.Crash栈

技术分享

3.BadTokenException类型

技术分享

4.原因

在WebView中,可以通过JS与前端页面进行交互,在JS调用中,会有很多的情况下在Native页面进行弹窗提示,如JSAlert,JSPrompt,JSConfirm等等。如果当Activity正在销毁,或者当前窗口的Token失效时,会导致该Crash.

5.代码分析

a.WebView中调用setWebChromeClient,将WebChromeClient设置到mProvider中

技术分享

b.mProvider是通过WebViewFactoryProvider中拿到WebViewFacotryProvider的实例

技术分享

c.通过反射,创建出WebViewClassic$Factory的实例返回

技术分享

d.在WebViewClassic的setWebChromeClient,调用CallbackProxy.setWebChromeClient

技术分享

e.在CallbackProxy.handleMessage中,发现在mWebChromClient.onJSAlert等Hook函数中可以拦截弹窗事件

技术分享

6.解决方案

在WebView中设置WebChromeClient,并且在onJSConfirm等等会弹出系统AlertDialog前进行判断,如果当前的Token失效,则不进行弹窗,返回true即可

判断Token失效需要判断:

1.当前Activity是否处于finish状态

2.Activity的Token处于Alive并且处于Active状态

 

[Crash修复方案]WebView中BadTokenException

原文:http://www.cnblogs.com/tieba/p/4980971.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!