在Android中的服务中运行JavaScript

我有用JavaScript编写的业务逻辑,此代码与其他非Android应用程序共享。

在Android中的Service中使用这段JavaScript中的函数的最佳方式是什么?

AFAIK,有2个选项?

  • V8是内置于标准的WebView和超快速,没有额外的apk膨胀。
  • 犀牛,这是非常棘手的Android?

关注V8 / Webview,当我试图访问WebView,任何function,我得到;

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?

3)如果上述任何一个是不可能的..我想我会去得到犀牛,任何提示将不胜感激,我只看到了一些博客抱怨的问题,以实现Android上的问题,并怀疑是否有Android的“去”版本保持在某个地方。

Solutions Collecting From Web of "在Android中的服务中运行JavaScript"

V8从服务中找不到任何关于V8的事情。

结束了使用犀牛,但是一个警告任何人跟随我的脚步,这是非常缓慢的。

只需从https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?redirectlocale=en-US&redirectslug=Rhino下载官方最新的Rhino发行版即可下载

js.jar是你需要在zip中。 JS-14是一个更大的Java 1.4兼容版本,你不需要。

集成是一个快照只需将jar文件夹放入libs文件夹即可。

下面是我用javascript(把数据转换成更好的格式化的JSON)刮网页。 使用来自assets文件夹的parse.js脚本。

犀牛不会与DOM,env.js崩溃与stackoverflow错误。 总的来说,我会说这个解决scheme是缓慢的,并没有很好的支持…

 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());