gpt4 book ai didi

javascript - Lollipop 上带有 WebView 的 Android 同步 Javascript

转载 作者:太空狗 更新时间:2023-10-29 16:16:13 25 4
gpt4 key购买 nike

使用从 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 接口(interface)是这样使用的:

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 (Lollipop)。

看起来好像在 Lollipop 中 JS 在闩锁倒计时完成后执行,而以前它会在倒计时完成之前返回一个值。

Webview 中 JS 执行的线程有什么变化吗?有什么方法可以解决这个问题,而无需重新编写依赖于能够同步调用 JS 的应用程序的大部分内容?

最佳答案

 loadUrl("javascript:" + code)

不要使用 API > 19,而是使用:

 evaluateJavascript(code, null);

或者,您可以改进代码以使用 evaluateJavascript 提供的回调。

关于javascript - Lollipop 上带有 WebView 的 Android 同步 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26606702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com