Android WebView无法加载URL,自定义JavaScriptInterface加载URL失效
解决WebView在JavaScriptInterface中调用loadUrl不生效的问题
你已经通过日志确认if (html.contains("class"))条件触发了,但browser.loadUrl(url2)就是没反应,这是个很常见的Android WebView线程问题——JavaScript接口的方法是在非UI线程执行的,而WebView的所有操作必须在UI线程中运行。
核心原因
Android的UI组件(包括WebView)都有严格的线程限制,所有修改UI或调用UI组件方法的操作必须在主线程(UI线程)执行。而processHTML方法是由JavaScript引擎在后台线程调用的,直接在这里调用browser.loadUrl()会被系统静默拦截,不会执行加载操作。
修复方案:切换到UI线程执行
你需要把loadUrl和View可见性修改的代码包裹到UI线程的执行逻辑里,推荐用WebView自身的post()方法(因为View的post方法默认会切换到UI线程),或者用Activity.runOnUiThread()。
修改后的代码如下:
class MyJavaScriptInterface { @JavascriptInterface @SuppressWarnings("unused") public void processHTML(String html) { Log.e("processHTML::",html); Log.e("url2::",url2); if (html.contains("class")){ Log.e("<span class::","yes"); // 确保WebView对象非空,再切换到UI线程加载URL if (browser != null) { browser.post(new Runnable() { @Override public void run() { browser.loadUrl(url2); } }); } }else { // 修改ProgressBar可见性同样要在UI线程 if (PRB != null) { PRB.post(new Runnable() { @Override public void run() { PRB.setVisibility(View.INVISIBLE); } }); } } } }
额外检查点
除了线程问题,你可以再排查以下几点确保加载正常:
- 确认
url2是合法的完整URL(比如带http://或https://前缀),无格式错误; - 检查WebView的设置,确保已启用JavaScript:
webSettings.setJavaScriptEnabled(true); - 确认
browser对象没有被提前销毁(比如Activity/Fragment生命周期结束后),非空判断能避免空指针问题; - 如果
url2是本地资源或自定义协议,确保WebView配置了对应的权限或允许加载规则。
内容的提问来源于stack exchange,提问作者AhmadReza Molaei
相关产品推荐
相关产品推荐

