Appearance
源码:labs/java/bridge-hybrid/dual-engine-transport-simulation/src/DualEngineTransportSimulation.java
- 原始路径:
labs/java/bridge-hybrid/dual-engine-transport-simulation/src/DualEngineTransportSimulation.java - 类型:
java
java
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 双 WebView 引擎运输层抽象仿真(对应 docs/05-bridge-hybrid/10)。
*
* 核心思想:用一个轻量 shim 把底层 WebView 引擎的实现差异屏蔽掉,
* 让 H5 只认一套调用协议(postMessage),不感知底层是哪种引擎。
*
* 纯 Java CLI(无外部依赖,接口 + 策略模拟双引擎)。
* 运行:javac -d out src/DualEngineTransportSimulation.java && java -cp out DualEngineTransportSimulation
*/
public class DualEngineTransportSimulation {
/** 运输层接口:屏蔽底层 WebView 实现差异 */
interface BridgeTransport {
String name();
boolean ready(); // 注入是否就绪(注入时机不同)
String call(String handler, String payload);
}
/** 实现 A:能力全的引擎,documentStart 立即注入 */
static class InAppTransport implements BridgeTransport {
public String name() { return "inappwebview"; }
public boolean ready() { return true; }
public String call(String handler, String payload) {
return "[inapp]" + handler + "(" + payload + ")";
}
}
/** 实现 B:回退引擎,onPageStarted 才尽力注入 */
static class FallbackTransport implements BridgeTransport {
public String name() { return "webview_flutter"; }
public boolean ready() { return false; }
public String call(String handler, String payload) {
return "[fallback]" + handler + "(" + payload + ")";
}
}
/** H5 统一调用的 shim:内部转调当前运输层,H5 不感知引擎 */
static class BridgeShim {
BridgeTransport transport;
boolean useInApp; // 等价于 window.__USE_INAPP_TRANSPORT__
String postMessage(String handler, String payload) {
return transport.call(handler, payload);
}
}
public static void main(String[] args) {
BridgeShim shim = new BridgeShim();
System.out.println("=== 场景1:主键引擎就绪,shim 走 inappwebview ===");
shim.transport = new InAppTransport();
shim.useInApp = true;
System.out.println(" window.__USE_INAPP_TRANSPORT__ = " + shim.useInApp);
System.out.println(" shim.postMessage('getDeviceInfo','{}') -> "
+ shim.postMessage("getDeviceInfo", "{}"));
System.out.println();
System.out.println("=== 场景2:回退引擎未就绪,shim 仍走统一协议(注入时机差异)===");
shim.transport = new FallbackTransport();
shim.useInApp = false;
System.out.println(" window.__USE_INAPP_TRANSPORT__ = " + shim.useInApp);
System.out.println(" 运输层 ready=" + shim.transport.ready()
+ "(onPageStarted 才注入,H5 需 waitForBridge)");
System.out.println(" shim.postMessage('getDeviceInfo','{}') -> "
+ shim.postMessage("getDeviceInfo", "{}"));
System.out.println();
System.out.println("=== 结论 ===");
System.out.println(" · H5 只调用 shim.postMessage,不感知底层是哪种 WebView");
System.out.println(" · 差异由 useInApp 标志 + shim 内部转调屏蔽;注入时机差异由 waitForBridge 兜底");
}
}