javascript - 如何从 webView.evaluateJavascript 回调返回值?

标签 javascript java android callback

所以我有一个名为 JavascriptBridge 的类,用于在 Java 和 Javascript 之间进行通信。

要向 javascript 发送命令,我只需使用这个:

public void sendDataToJs(String command) {
    webView.loadUrl("javascript:(function() { " + command + "})()");
}

我的问题是我还需要一个从 Javascript 返回响应的函数。我尝试使用 webView.evaluateJavascript,但它跳过了回调,因为 evaluateJavascript 是在另一个线程上完成的。

public String getDataFromJs(String command, WebView webView) {
    String data = null;

    webView.evaluateJavascript("(function() { return " + command + "; })();", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String s) {
            Log.d("LogName", s); // Print "test"
            // data = s; // The value that I would like to return
        }
    });

    return data; // Return null, not "test"
}

调用方法:

String result = getDataFromJs("test", webView); // Should return "test" from the webView

我也尝试过使用 @JavascriptInterface,但结果相同。

最佳答案

没有办法在 Android 上同步评估 Javascript(即在当前线程上),所以最好的办法是使用 evaluateJavascript 然后等待回调:

public void getDataFromJs(String command, WebView webView) {
    webView.evaluateJavascript("(function() { return " + command + "; })();", new ValueCallback<String>() {
        @Override
        public void onReceiveValue(String s) {
            returnDataFromJs(s);
        }
    });
}

public returnDataFromJs(String data) {
    // Do something with the result.
}

没有在当前线程上评估 Javascript 的方法,因为 Javascript 操作可能需要一段时间(JS 引擎需要时间来启动)并且这可能会阻塞当前线程。

关于javascript - 如何从 webView.evaluateJavascript 回调返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39322904/

相关文章:

java - 如何在 Spring Boot 应用程序中使用 JPA 删除/获取列表

Android:来电自动接听,播放音频文件

java - Xamarin - 使用 JavaScript 调用 Android 函数

javascript - 将套接字连接到特定路径

javascript - Redux - 从嵌套在另一个数组中的数组中删除对象

Java:复合

java - 对我的 ArrayList 进行排序的正确方法是什么?

android - 如何为所有 Activity 创建通用的 Android XML 布局

javascript - 是否可以使用网页作为用 python 编写的程序的用户界面,在本地运行,无需 Web 服务器?

javascript - 当悬停被移除或消失时如何应用过渡?