如何在 Android WebView 中使 JavaScript-Java 通信同步?

发布于 2024-12-11 21:52:31 字数 696 浏览 0 评论 0原文

我里面有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 之后调用 WebView 中的脚本之间存在延迟。 loadUrl() 以及数据返回到我的 Java 代码的时刻。 Java 代码不会等待 JS 完成它的工作。我该如何解决这个问题?

I've got WebView, JS code inside it. Also I have interface to allow Java method invocation from WebView to Java code. I need to pass data from JS to Java. To do so:

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

//Obtain Java object here

In JavaScript:

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

In JavaScript interface(Java code):

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

The problem is: I've got a delay between calling script in WebView after webView.loadUrl() and moment when data is returned to my Java code. Java code doesn't wait for JS to finish it's business. How do I solve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

触ぅ动初心 2024-12-18 21:52:31

我遇到的唯一(hacky)解决方案是使用 一秒延迟 调用 loadUrl 后。您可以使用 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();
    }
}

The only (hacky) solution that I've come across is using a one second delay after calling the loadUrl. You may use the addJavaSriptInterface() to do so.

or if the JS processing takes too long you have to use callbacks

<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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文