Android同步Javascript与棒棒糖上的WebView
Android Synchronous Javascript with WebView on Lollipop
使用从http://www.gutterbling.com/blog/synchronous-javascript-evaluation-in-android-webview/我们已经成功地在我们的应用程序中实现了许多功能,这些功能允许我们的Android应用程序从Webview同步获取数据。
下面是gutterbling的例子:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import android.content.Context;
import android.util.Log;
import android.webkit.WebView;
/**
* Provides an interface for getting synchronous javascript calls
* @author btate
*
*/
public class SynchronousJavascriptInterface {
/** The TAG for logging. */
private static final String TAG = "SynchronousJavascriptInterface";
/** The javascript interface name for adding to web view. */
private final String interfaceName = "SynchJS";
/** Countdown latch used to wait for result. */
private CountDownLatch latch = null;
/** Return value to wait for. */
private String returnValue;
/**
* Base Constructor.
*/
public SynchronousJavascriptInterface() {
}
/**
* Evaluates the expression and returns the value.
* @param webView
* @param expression
* @return
*/
public String getJSValue(WebView webView, String expression)
{
latch = new CountDownLatch(1);
String code = "javascript:window." + interfaceName + ".setValue((function(){try{return " + expression
+ "+'"'";}catch(js_eval_err){return '';}})());";
webView.loadUrl(code);
try {
// Set a 1 second timeout in case there's an error
latch.await(1, TimeUnit.SECONDS);
return returnValue;
} catch (InterruptedException e) {
Log.e(TAG, "Interrupted", e);
}
return null;
}
/**
* Receives the value from the javascript.
* @param value
*/
public void setValue(String value)
{
returnValue = value;
try { latch.countDown(); } catch (Exception e) {}
}
/**
* Gets the interface name
* @return
*/
public String getInterfaceName(){
return this.interfaceName;
}
}
这个JS接口是这样使用的:
WebView webView = new WebView(context);
SynchronousJavascriptInterface jsInterface = new jsInterface();
webView.addJavascriptInterface(jsInterface, jsInterface.getInterfaceName());
String jsResult = jsInterface.getJSValue(webView, "2 + 5");
尽管在Android 4.0-4.4.4中运行良好,但这对我们的Android 5.0(棒棒糖)不起作用。
在棒棒糖中,JS似乎在锁存倒计时完成后执行,而之前它会在倒计时完成前返回一个值。
Web视图中JS执行的线程有什么变化吗?有没有什么方法可以在不重写我们应用程序中依赖于能够同步调用JS的大块内容的情况下解决这个问题?
loadUrl("javascript:" + code)
不要使用API>19,而是使用:
evaluateJavascript(code, null);
或者,您也可以改进代码,使用evaluatteJavascript提供的回调。
相关文章:
- HTML5页面底部棒
- JQuery UI可拖动潜水与滚动棒到鼠标
- 很棒的共享按钮application.coffee文件在哪里
- JavaScript中的OOP太令人困惑了,ES6很棒,但没有得到很好的支持,该怎么办
- bootstrap字体真棒can'不起作用[使用cdn]
- 向上滑动操作后,字体真棒图标不显示
- Jquery手风琴与字体真棒切换
- 在jquery中设置字体真棒图标
- 如何导出字体真棒svg图标作为base64网址
- 我如何更改谷歌页面编辑器使用字体真棒图标
- 如何在onclick中添加font真棒微调器
- 字体真棒图标不显示
- 单击社交媒体图标(字体真棒)而未重定向到href
- 如何将 dijit 树中的图标替换为字体真棒图标
- 显示字体 画布上的真棒字符
- 如何创建动态文本并使用 KineticJS 对其进行编辑.任何可以说明的例子都会很棒
- 字体真棒元素太大
- 咕噜咕噜的复制和字体真棒字体
- Android同步Javascript与棒棒糖上的WebView
- 不工作以前的页面功能在android旧版本像果冻豆,kitkat android,它的工作只有棒棒糖版本