V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
serge001
V2EX  ›  Android

js 调用 Java 方法延迟问题?

  •  
  •   serge001 · 2018-09-03 13:23:02 +08:00 · 3848 次点击
    这是一个创建于 2033 天前的主题,其中的信息可能已经有所发展或是发生改变。

    通过

    CustomChromeClient client = new CustomChromeClient("jsBridge", WebCallJsfunction.class)
    

    为 webview 中的 window 全局对象添加了 jsBridge 属性,但是在 webview 加载的网页 js 中通过 window.jsBridge 访问到的是 undefined, 经过排查发现, 必须要延迟一段时间才能获取到:

    setTimeout(() => {
      window.jsBridge
    }, 100)
    

    我的猜想是 java 中定义的方法 WebCallJsFunction.class 和页面加载的 js 是同时执行的,页面刚加载的时候 java 代码还没有执行完毕, 所以才会这样, 请问我的猜测正确吗? 有什么好的解决方案吗?

    3 条回复    2018-09-07 14:31:35 +08:00
    p2pCoder
        1
    p2pCoder  
       2018-09-03 13:40:20 +08:00
    我用 JavascriptInterface 实现过
    ```
    接口:
    public class WeiboJsInterface {
    @JavascriptInterface
    public void getPwd(String returnValue) {
    try {
    unpwDict = new JSONObject(returnValue);
    } catch (JSONException e) {
    e.printStackTrace();
    }
    }
    }
    加载到当前 webview:
    webView.addJavascriptInterface(new WeiboJsInterface(), "weibo");

    js 调用:
    function transPortUnAndPw(){
    username=selectNode('//*[@id="loginName"]').value;
    pwd=selectNode('//*[@id="loginPassword"]').value;
    window.weibo.getPwd(JSON.stringify({"username":username,"pwd":pwd}));
    }
    ```
    具体可以参见 https://github.com/zgbgx/appWeiboInfoCrawl/tree/master/weibo
    我没用过 bridge 来实现
    chenyu8674
        2
    chenyu8674  
       2018-09-04 15:12:02 +08:00
    同楼上,JavascriptInterface 无延迟
    serge001
        3
    serge001  
    OP
       2018-09-07 14:31:35 +08:00
    @p2pCoder @chenyu8674 的确可以,多谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   989 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:58 · PVG 05:58 · LAX 14:58 · JFK 17:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.