關於在 @JavascriptInterface 方法中發現異常引發的思考
阿新 • • 發佈:2018-11-06
問題描述:
在一次測試中,直接在 @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
方法會不會潛在一些異常,但是因為上述原因一直沒暴露出來,甚至可能對使用者產生了直接影響的,有時間還是需要對以前的程式碼進行一下回顧。