在@JavascriptInterface中调用WebView.loadUrl致应用崩溃求助
问题分析
核心问题是:被@JavascriptInterface注解的方法默认运行在JavaBridge线程,而WebView的所有操作必须在主线程(UI线程)执行,直接在getTestData()里调用webview.loadUrl()会触发跨线程操作的崩溃。
解决方法
有两种常用的主线程调度方式:
方法一:使用Activity的runOnUiThread
如果你的类是Activity,直接用runOnUiThread包裹WebView操作:
@JavascriptInterface fun getTestData(){ runOnUiThread { webview.loadUrl("https://www.facebook.com") } }
方法二:使用Handler绑定主线程Looper
如果你的类不是Activity(比如Fragment或自定义类),可以创建绑定主线程的Handler:
// 在类中初始化主线程Handler private val mainHandler = Handler(Looper.getMainLooper()) @JavascriptInterface fun getTestData(){ mainHandler.post { webview.loadUrl("https://www.facebook.com") } }
补充说明
- WebView的核心操作(
loadUrl、evaluateJavascript、addJavascriptInterface等)都必须在主线程执行,这是Android WebView的硬性要求。 JavaBridge线程是WebView用于处理JS与原生交互的后台线程,不能直接在此线程操作UI组件。
内容的提问来源于stack exchange,提问作者YadavK
相关产品推荐
相关产品推荐

