在没有loadUrl或XHR的android.webkit.WebView中执行javascript代码

时间:2011-11-29 20:18:14

标签: java javascript android cordova

我正在编写一个phoneGap插件,允许Android设备上的多点触控(希望最终将其包含在phonegap / callback中)

事件委托使用插件成功回调需要大约200ms,使用WebView.loadUrl('javascript:somecodehere()')调用大约需要50ms

不幸的是,loadUrl具有闪烁软键盘的副作用,这对于一般解决方案是不可接受的。

Phonegap的Plugin.success使用内部Web服务器和XmlHttpRequest对象来发送数据,这种方法太慢了。

有没有第三种方法将javascript发送到网络浏览器? (甚至发送戳到javascript引擎以导致事件发生,以便事件可以检查自定义的jsInterface对象)

4 个答案:

答案 0 :(得分:0)

在WebView类中查看addJavascriptInterface。这听起来更像你在寻找什么。

答案 1 :(得分:0)

在你的插件中尝试调用:

this.ctx.sendJavascript(statement);

不如loadUrl快,但它可能比返回PluginResult快一点。

答案 2 :(得分:0)

您可以使用基本上是arraylist和访问器的java对象来滚动自己的剥离消息队列,然后使用addJavascriptInterface将其绑定到javascript上下文并注入一个javascript轮询循环,该循环使用setTimeout来调用accessor方法你的队列。每当你有javascript执行时,只需将它添加到你的arraylist。我不确定它会如何表现,但也许值得一试?

class JSQueue {
    private ArrayList<String> messages;

    public String getMessage() {
        String message = "";
        if(messages.size() >0) {
            message = messages.remove(0);
        }
        return message;
    }
    public void addMessage(String message) {
        messages.add(message);
    }
}
JSQueue jsq = new JSQueue();
dc.appMobiCanvas.hiddenView.addJavascriptInterface(jsq, "jsq");
dc.appMobiCanvas.hiddenView.loadUrl("javascript:(function checkJSQ(){eval(jsq.getMessage());setTimeout(checkJSQ, 50);}})();");
//add messages via jsq.addMessage();

答案 3 :(得分:0)

似乎我们已经开发了类似的东西

https://github.com/Philzen/webview-multitouch-polyfill

但是,我从未经历过您之前描述的问题,但也许您想在您的设备上进行测试,或者可能会为项目贡献您的专业知识。已在Cordova (Phonegap) Roadmap上提出建议,因此我们很乐意为每个用户和/或贡献者提供帮助以帮助实现这一目标!