码迷,mamicode.com
首页 > Web开发 > 详细

[Crash修复方案]WebView中BadTokenException

时间:2015-11-20 16:47:49      阅读:231      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!