程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Android DSBridge 使用教程(Java版):H5与原生交互快速入门

balukai 2025-04-07 12:02:33 文章精选 13 ℃

近日需要做一个ANDROID 原生+H5插件化开发的项目,暂无头绪,先研究一下 Android DSBridge这个框架的使用,熟悉了再继续ANDROID 原生+H5插件化框架的开发

一、DSBridge 简介

DSBridge 是一款轻量级的跨平台 JavaScript 桥接框架,专为解决 H5 与原生(Android/iOS)双向通信而设计。相比传统 WebView 交互方案,它具备以下核心优势:

  • 同步/异步双模式支持:原生与 H5 可实时传递数据
  • 双向调用能力:H5 可调用原生方法,原生也可主动调用 H5 函数
  • 零反射安全调用:规避传统 WebView 反射的安全风险
  • 三端统一 API:Android/iOS/H5 使用相同调用规范

二、环境配置(Android Java)

1. 添加依赖

在项目的 build.gradle 中添加仓库和依赖(推荐最新版本):

repositories {
  
  //一般用阿里云的仓库
    maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/jcenter' }
        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
        mavenCentral()
        maven { url "https://jitpack.io" }
    
        google()
}

dependencies {
    implementation 'com.github.wendux:DSBridge-Android:3.0.5'
  //这个挺难下载的,建议直接到GITHUB中下载源码包含到项目中
   //implementation project(':dsbridge') 我是用这种包含源码的方式
}

2. 配置 WebView

在布局文件 activity_main.xml 中声明 DSBridge 的专用 WebView:


三、基础交互示例

1. 原生暴露方法给 H5

创建 Java 接口类 JsApi.java:

import android.webkit.JavascriptInterface;

public class JsApi {
    // 同步方法(直接返回结果)
    @JavascriptInterface
    public String syncMethod(String params) {
        return "Java同步处理:" + params;
    }

    // 异步方法(通过CompletionHandler回调)
    @JavascriptInterface
    public void asyncMethod(String params, CompletionHandler handler) {
        new Handler(Looper.getMainLooper()).postDelayed(() -> {
            handler.complete("Java异步响应:" + params);
        }, 1000); // 模拟延迟操作
    }
}

在 MainActivity 中绑定接口:

public class MainActivity extends AppCompatActivity {
    private DWebView dWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dWebView = findViewById(R.id.dwebview);
        dWebView.addJavascriptObject(new JsApi(), "nativeObj"); // 绑定到H5的window.nativeObj
        dWebView.loadUrl("file:///android_asset/demo.html");
    }
}

2. H5 调用原生方法

创建 demo.html(存放在 src/main/assets):




    <script src="dsbridge.js"></script> 


    
    

    <script>
        // 同步调用示例
        function callSync() {
            let result = dsBridge.call("nativeObj.syncMethod", "Hello Java!");
            alert("同步结果:" + result);
        }

        // 异步调用示例
        function callAsync() {
            dsBridge.call("nativeObj.asyncMethod", "Async Call", function(res) {
                alert("异步结果:" + res);
            });
        }
    </script>

3. 原生调用 H5 方法

在 H5 中注册方法:

// 注册H5方法供原生调用
dsBridge.register('h5Method', function(arg) {
    return "H5收到参数:" + arg + ",处理完成!";
})

Java 端触发调用:

// 同步调用
String result = dWebView.callHandler("h5Method", "Java参数");
Log.d("DSBridge", result);

// 异步调用
dWebView.callHandler("h5Method", "Java参数", new OnReturnValue() {
    @Override
    public void onValue(String retValue) {
        Log.d("DSBridge", "异步回调:" + retValue);
    }
});

四、核心 API 详解

方法名

作用描述

addJavascriptObject

将Java对象注入到JavaScript上下文

callHandler

调用H5注册的方法

removeJavascriptObject

移除已注册的Java对象

disableJavascriptDialog

禁用WebView弹窗


五、常见问题排查

1. 方法调用无响应

  • 检查方法是否添加 @JavascriptInterface 注解
  • 确认H5调用路径格式为 对象名.方法名
  • 确保已正确引入 dsbridge.js

2. 参数传递异常

  • 复杂对象建议使用 JSON 字符串传递
  • 原生端通过 JSONObject/JSONArray 解析

3. 异步回调未执行

  • 确保 CompletionHandler 参数存在
  • 避免在异步方法中直接操作 UI 线程

六、进阶实战技巧

1. 多模块通信

// 注册不同功能模块
dWebView.addJavascriptObject(new UserModule(), "user");
dWebView.addJavascriptObject(new DeviceModule(), "device");

2. 异常捕获机制

dWebView.setJavascriptExceptionHandler(e -> {
    Log.e("JS Error", "JavaScript异常: " + e.getMessage());
});

3. 类型自动转换

支持以下数据类型双向转换:

  • 基本类型(int/boolean等)
  • String
  • JSONObject
  • JSONArray
  • 自定义对象(需实现序列化)

七、最佳实践建议

  1. 命名规范化:使用驼峰命名法(如 user.getInfo)
  2. 参数校验:在方法入口处验证参数合法性
  3. 线程管理:异步操作需切换至子线程执行
  4. 版本兼容:通过 @Override 标注兼容方法

资源推荐

官方文档

示例工程

常见问题汇总

本文通过 Java 实现完整通信链路,读者可下载示例代码进行扩展开发。遇到技术问题欢迎在评论区交流

最近发表
标签列表