Skip to content

源码: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 兜底");
    }
}

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