关于在 @JavascriptInterface 方法中发现异常引发的思考

问题描述:

在一次测试中,直接在 @JavascriptInterface 方法中调用了 WebView.loadUrl("javascript:xxx()");,结果 js 方法没有响应。当时以为是调用频繁或者页面刷新导致无法接收到消息,进一步测试发现在 Logcat 中有输出日志:
在这里插入图片描述
java.lang.RuntimeException: java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread.

解决方案:

这个问题是由于 js 方法在子线程中执行导致的异常,WebView 相关的方法需要在主线程中执行。

拓展思考:

这个问题其实很常规,即要在 Android 主线程中进行 View 相关的操作。但是当时并没有往这个方面去考虑,而是在没有响应上面纠结了很久。原因是因为页面没有崩溃,根本没想到是会是异常导致的问题。

所以这里不禁思考为什么没有崩溃,于是手动抛出一个异常试试:throw new RuntimeException();。结果还是没有崩溃,但是有打印日志:
在这里插入图片描述
W/System.err: java.lang.RuntimeException

通过 System.err 可以看出这是主动打印出来的错误信息,也就是说,系统有对 @JavascriptInterface 方法进行类似 try/catch 的操作,并打印出了异常信息。查看函数调用栈,发现只有当前方法的调用记录,没有上层的调用关系。这里仅记录该问题及原因,对原理感兴趣的小伙伴可以进一步分析底层源码。

最后不禁思考,平时定义的 @JavascriptInterface 方法会不会潜在一些异常,但是因为上述原因一直没暴露出来,甚至可能对用户产生了直接影响的,有时间还是需要对以前的代码进行一下回顾。

你可能感兴趣的:(Android,日常填坑)