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

要将命令发送到javascript,我只需使用以下命令:

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

我的问题是,我还需要一个返回Javascript响应的函数。我尝试使用 webView.evaluateJavascript ,但是它跳过了回调,因为valuateJavascript是在另一个线程上完成的。
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引擎需要一些时间来启动),并且这可能会阻塞当前线程。

10-04 19:30