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

如何从webView.evaluateJavascript回调返回值?,javascript,java,android,callback,Javascript,Java,Android,Callback,因此,我有一个名为JavascriptBridge的类,用于在Java和Javascript之间进行通信 要向javascript发送命令,我只需使用以下命令: public void sendDataToJs(String command) { webView.loadUrl("javascript:(function() { " + command + "})()"); } 我的问题是,我还需要一个从Javascript返回响应的函数。我尝试使用webView.evaluateJa

因此,我有一个名为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"
}

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

在Android上没有同步评估Javascript的方法(即在当前线程上),因此最好使用
评估Javascript
,然后等待回调:

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.
}
public void getDataFromJs(字符串命令,WebView-WebView){
evaluateJavascript(((function(){return“+command+”;})();”,new ValueCallback(){
@凌驾
公共void onReceiveValue(字符串s){
从JS返回数据;
}
});
}
public returnDataFromJs(字符串数据){
//对结果做点什么。
}

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

我用Kotlin编写了一个小代码片段,可以帮助您。我是用RxKotlin写的,但是如果你使用Java,你可以使用RxJava2,因为它们是一样的

fun getDataFromJsSync(command: String, webView: WebView): String {
    return getDataFromJs(command, webView).blockingGet()
}

fun getDataFromJs(command: String, webView: WebView): Single<String> {
    return Single.create { emitter: SingleEmitter<String> ->
        try {
            webView.evaluateJavascript(
                    "(function() { return $command; })();",
                    { result -> emitter.onSuccess(result) }
            )
        } catch (e: Exception) {
            emitter.onError(e)
        }
    }
}
fun getDataFromJsSync(命令:String,webView:webView):String{ 返回getDataFromJs(命令,webView).blockingGet() } fun getDataFromJs(命令:String,webView:webView):单个{ 返回Single.create{emitter:SingleEmitter-> 试一试{ webView.evaluateJavascript( “(函数(){return$command;})();”, {result->emitter.onSuccess(result)} ) }捕获(e:例外){ 发射器。onError(e) } } }
另外,我还没有测试这些函数,也不能保证它们能正常工作,但我没有时间,我会在有时间的时候测试它们并用Java重写它们,可能最多5个小时。

有没有任何同步选项可以解决这个问题?@soommy12我不知道,很遗憾。您可以阻止主线程并等待
evaluateJavascript
返回,但我不建议这样做,因为这可能会导致您的应用程序丢弃帧。
fun getDataFromJsSync(command: String, webView: WebView): String {
    return getDataFromJs(command, webView).blockingGet()
}

fun getDataFromJs(command: String, webView: WebView): Single<String> {
    return Single.create { emitter: SingleEmitter<String> ->
        try {
            webView.evaluateJavascript(
                    "(function() { return $command; })();",
                    { result -> emitter.onSuccess(result) }
            )
        } catch (e: Exception) {
            emitter.onError(e)
        }
    }
}