You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:33:17