如何从webView.evaluateJavascript回调返回值?
因此,我有一个名为JavascriptBridge的类,用于在Java和Javascript之间进行通信 要向javascript发送命令,我只需使用以下命令:如何从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
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)
}
}
}