WebView webView = // ... get this from somewhere
MyCallback callback = new MyCallback();
webView.addJavaScriptInterface(callback, "callback");
webView.loadURL("javascript:callback.setReturnValue(someFunction())");
System.out.println("return value is " + callback.getReturnValue());
public class MyInterface
{
private String value;
private Semaphore semaphore;
public MyInterface(Semaphore semaphore) {
this.semaphore = semaphore;
}
public String getValue() {
return value;
}
@JavascriptInterface
public void setValue(String value) {
this.value = value;
//important release the semaphore after the execution
semaphore.release();
}
}
1.将javascript界面添加到Android Web视图
Semaphore mySemaphore = new Semaphore(0);
MyInterface myJsInterface = new MyInterface(mySemaphore);
webView.addJavascriptInterface(myJsInterface, "jsInterface");
1.执行JavaScript并等待执行
webView.evaluateJavascript("var myValue='this works';jsInterface.setValue(myValue);", null);
//await the execution
mySemaphore.acquire();
//the interface now have the value after the execution
myJsInterface.getValue();
4条答案
按热度按时间6xfqseft1#
是的,但是你必须使用WebView.addJavaScriptInterface()。
igetnqfo2#
我相信它是同步的,但是,就像你正确地注意到的那样,没有办法从调用中返回一个值。
首先,创建一个简单的类(假设你的返回类型是String):
保持这个类的简单和封装是很重要的,因为如果你从潜在的不可信的源加载HTML,它可能会给你的应用程序带来一个安全漏洞。也就是说,不要简单地传入你的Activity,让Javascript直接调用它的方法。
然后执行你想要的JavaScript,给它一个回调的示例来存储结果:
uujelgoq3#
这是一个老问题,但我看没有答案。下面是我如何做到这一点(但要小心阻止UI线程在这里(Kotlin)。
然后运行如下代码:
jv4diomz4#
webView.evaluateJavascript()
异步运行,但您可以使用一个简单的信号量来等待执行。步骤:
1.创建一个javascript接口(基本上是一个类,带有一个方法,将从我们想要评估的javascript中调用。
1.将javascript界面添加到Android Web视图
1.执行JavaScript并等待执行