1. 程式人生 > >關於在 @JavascriptInterface 方法中發現異常引發的思考

關於在 @JavascriptInterface 方法中發現異常引發的思考

問題描述:

在一次測試中,直接在 @JavascriptInterface 方法中呼叫了 WebView.loadUrl("javascript:xxx()");,結果 js 方法沒有響應。當時以為是呼叫頻繁或者頁面重新整理導致無法接收到訊息,進一步測試發現在 Locat 中有輸出日誌:

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 方法會不會潛在一些異常,但是因為上述原因一直沒暴露出來,甚至可能對使用者產生了直接影響的,有時間還是需要對以前的程式碼進行一下回顧。