Skip to content

源码:labs/java/bridge-hybrid/bridge-boundary-error-protocol-simulation/src/BridgeBoundaryErrorProtocolSimulation.java ​

  • 原始路径:labs/java/bridge-hybrid/bridge-boundary-error-protocol-simulation/src/BridgeBoundaryErrorProtocolSimulation.java
  • 类型:java
java
/**
 * 桥接边界与错误协议仿真(对应 docs/05-bridge-hybrid/12)。
 *
 * 覆盖三类桥接边界处理:
 *   1. 大整数精度:snowflake id(> 2^53)必须用字符串传,避免 JS number 丢精度
 *   2. 返回栈协商:goBack 先问 H5,H5 有历史就消费一条、否则交还原生关页
 *   3. 错误信封:桥错误用 {__isBridgeError:true} 包裹,区分原生报错与正常返回
 *
 * 纯 Java CLI(无外部依赖)。
 * 运行:javac -d out src/BridgeBoundaryErrorProtocolSimulation.java && java -cp out BridgeBoundaryErrorProtocolSimulation
 */
public class BridgeBoundaryErrorProtocolSimulation {

    public static void main(String[] args) {
        System.out.println("=== 1. 大整数精度:snowflake id > 2^53 ===");
        long snowflakeId = 1872039485720394857L; // > 2^53,JS number 会丢精度
        // 双重 JSON.encode:让 JS 把它当字符串解析,不当 number
        String safe = "\"" + snowflakeId + "\""; // 等价于 JSON.encode(JSON.encode(id))
        System.out.println("  原始 long      = " + snowflakeId);
        System.out.println("  直接当 number  = 丢失精度(Double 只有 53 位尾数)");
        System.out.println("  双重 encode     = " + safe + " → JS 当 string 解析,精度保全 ✅");

        System.out.println();
        System.out.println("=== 2. 返回栈协商:goBack 先问 H5 ===");
        // H5 栈内有历史 → 消费一条;栈空 → 交还原生关页
        boolean h5HasHistory = true;
        boolean answered = askH5TryGoBack(500); // 带 500ms 超时
        if (answered && h5HasHistory) {
            System.out.println("  H5 消费一条历史(Vue Router back),页面不关 ✅");
        } else {
            System.out.println("  H5 无历史 / 超时未答 → 原生关闭页面 ✅");
        }

        System.out.println();
        System.out.println("=== 3. 错误信封:区分『原生报错』与『正常返回』===");
        System.out.println("  正常返回: " + normalReturn("{success:true}"));
        System.out.println("  原生报错: " + errorReturn("PERMISSION_DENIED"));
        System.out.println("  H5 靠 __isBridgeError 区分,不会把异常当业务数据渲染 ✅");

        System.out.println();
        System.out.println("=== 结论 ===");
        System.out.println("  · 大 ID 用字符串传,避免 JS number 精度丢失");
        System.out.println("  · goBack 协商 + 超时兜底,避免误关页或卡在死栈");
        System.out.println("  · 错误信封让 H5 分清『原生异常』与『正常数据』");
    }

    /** 模拟 askH5TryGoBack:H5 在 timeout 内回 true/false;超时则视为无历史 */
    static boolean askH5TryGoBack(long timeoutMs) {
        // 示意:实际由 JS 桥返回值决定,跨实现返回类型需兼容 bool/string/int
        return true;
    }

    static String normalReturn(String data) {
        return "{data:" + data + "}";
    }

    static String errorReturn(String code) {
        return "{__isBridgeError:true, code:\"" + code + "\"}";
    }
}

站点构建时间:2026/8/24 23:43:17