Appearance
源码: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 + "\"}";
}
}