【问题标题】:How do I make JavaScript-Java communication sync in Android WebView?如何在 Android WebView 中使 JavaScript-Java 通信同步?
【发布时间】:2011-10-23 21:32:39
【问题描述】:

我有 WebView,里面有 JS 代码。我也有接口允许从 WebView 到 Java 代码的 Java 方法调用。 我需要将数据从 JS 传递到 Java。 这样做:

webView.loadUrl("javascript:getData()");

//Obtain Java object here

在 JavaScript 中:

function gataData () {
    //serialize data to JSON, pass it as 'native' function param
    JSInterface.setLocationsData(data);// This calls a Java function setLocationsData(String param)
}

在 JavaScript 接口中(Java 代码):

 void setLocationsData(String param){
    //parse JSON here, create Java Object
 }

问题是:在 webView.loadUrl() 之后调用 WebView 中的脚本与将数据返回到我的 Java 代码的时刻之间存在延迟。 Java 代码不会等待 JS 完成它的业务。我该如何解决?

【问题讨论】:

    标签: java javascript android webkit


    【解决方案1】:

    我遇到的唯一(hacky)解决方案是在调用 loadUrl 后使用one second delay。您可以使用addJavaSriptInterface() 这样做。

    或者如果 JS 处理时间过长你必须使用回调

    <input type="button" value="Say hello" onClick="callYourCallbackFunctionHere('Hello Android!')" />
    
    <script type="text/javascript">
        function callYourCallbackFunctionHere(toast) {
            Android.callAndroidCallback(toast);
        }
    </script>
    

    public class JavaScriptInterface {
        Context mContext;
    
        /** Instantiate the interface and set the context */
        JavaScriptInterface(Context c) {
            mContext = c;
        }
    
        /** Show a toast from the web page */
        public void callAndroidCallback(String toast) {
            Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        }
    }
    

    【讨论】:

    • 我已经有 JSInterface,所以我需要在其中进行回调,并且只有在调用该回调时才能在程序中继续。感谢您的回答。
    • 这个解决方案有多强大?我们可以使用这些方法进行完整的 java javascript 通信还是有一些重要的限制?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多