在Android的服务中运行JavaScript
Running JavaScript within a Service in Android
我有一个用JavaScript编写的业务逻辑,该代码与其他非android应用程序共享。
在Android服务中使用这段JavaScript中的函数的最佳方式是什么?
恐怕有两种选择?
- V8内置到标准的WebView和超快,没有额外的apk膨胀。
- Rhino,这是棘手的去Android?
专注于V8/Webview,当我试图访问Webview时,使用任何功能,我得到;
All WebView methods must be called on the UI thread. Future versions of WebView may not support use on other threads.
注意到警告,它现在甚至不起作用。当我设置webviewclient时,加载URL后什么也得不到。
我的问题分为三个部分;
1)有没有人在没有UI线程的webview中成功运行javascript ?
2)我如何从javascript内部的函数得到结果,是否webview接口"addJavascriptInterface"支持加载参数并将其发送回java?
如果以上任何一个都是不可能的……我想我会去用Rhino,任何建议都将是感激的,我只看到一些博客抱怨关于在Android上运行Rhino的问题,并想知道是否有一个用于Android的"go to"版本。在服务中找不到任何关于V8的内容
最后我使用了Rhino,但是我要提醒一下那些跟随我脚步的人,它的速度非常慢。
从Rhino的官方最新发行版中获取jarhttps://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?redirectlocale=en-US& redirectslug = RhinoDownload
js.jar是你需要的压缩文件。Js-14是一个更大的Java 1.4兼容版本,你不需要。
集成很简单,只要把jar放到你的libs文件夹中。
下面是我使用javascript抓取网页(将数据转换为更好格式的json)。使用我从assets文件夹中创建的parse.js脚本。
Rhino没有附带DOM,并且envy .js会因为stackoverflow错误而崩溃。总的来说,我想说这个解决方案很慢,而且没有得到很好的支持…
public static void sync(Context context, ){
String url = BASE_URL;
String html = Utils.inputStreamToString(Utils.getHTTPStream(url));
timeList.add(System.currentTimeMillis());
if(html == null){
Utils.logw("Could not get board list.");
return;
}
String parsingCode = null;
try {
parsingCode = Utils.inputStreamToString(context.getAssets().open("parse.js"));
} catch (IOException e) {
Utils.logw("Could not get board parser js");
return;
}
// Create an execution environment.
org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter();
// Turn compilation off.
cx.setOptimizationLevel(-1);
try {
// Initialize a variable scope with bindnings for
// standard objects (Object, Function, etc.)
Scriptable scope = cx.initStandardObjects();
ScriptableObject.putProperty(
scope, "html", org.mozilla.javascript.Context.javaToJS(html, scope));
//load up the function
cx.evaluateString(scope, parsingCode,"parseFunction", 1 , null);
// Evaluate the script.
Object result = cx.evaluateString(scope, "myFunction()", "doit:", 1, null);
JSONArray jsonArray = new JSONArray(result.toString());
- 在终端中运行 JavaScript 时(使用 rhino),如何使用 print() 函数在一行中打印
- 向下滚动时运行javascript
- 在Android WebView中运行Javascript-onPageFinished循环
- 在父网页的iframe中运行JavaScript
- 有条件地运行javascript函数-Razor,HTML
- 如何通过获取用户输入和使用按钮来运行JavaScript函数
- 使用c#在Web服务器上运行JavaScript方法
- 单击链接时停止运行javascript
- 在浏览器检查表单之前运行javascript onsubmit
- 如何在表单提交事件后运行JavaScript*
- Mediawiki小部件将不会运行javascript
- 有没有一种方法可以在服务器端页面加载之前在加载时运行javascript
- 在GitHub上运行JavaScript Koans
- Chrome扩展:是否有一种方法可以运行JavaScript来获取页面上的内部html,并将其保存到扩展中的变量中
- 在不加载页面的情况下运行javascript
- [AutoIt]如何使用FF.au3在FireFox上的页面中运行javascript
- 仅在屏幕媒体上运行javascript/jquery,而不是打印
- Scala提升了如何运行javascript函数并将返回值存储在变量中
- 安卓系统:通过loadUrl运行javascript时,网络视图中的视频会冻结
- 在页面加载完成之前,使用URL参数运行JavaScript