2013-05-08 31 views
8

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

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

AFAIK,有2个选项?

  • V8内置于标准WebView中,超快速,没有额外的apk膨胀。
  • 犀牛,这是棘手的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后我什么也没有得到。

我的问题是3部分;

1)有没有人在没有UI线程的情况下在webview中运行javascript的成功?

2)如何从javascript中的函数得到结果,webview接口“addJavascriptInterface”是否支持加载参数并将其发送回java? 3)如果上面的任何一个都不可能......我想我会去犀牛,任何提示将不胜感激,我只看到一些博客抱怨有关在Android上实现它的问题,想知道是否有一个“去”版本的Android维护的地方。

+0

为什么这会降低投票率。我花了很多精力来弄清楚这到底是什么,我相信很多开发人员都有兴趣在Android中使用脚本语言... – 2013-08-18 12:53:13

回答

6

无法从服务内容中找到与V8相关的任何内容。

结束了使用犀牛,但任何人跟随我的脚步警告的话,这是令人难以置信的缓慢。

随意在犀牛官方最新的分布从 https://developer.mozilla.org/en-US/docs/Rhino/Download_Rhino?redirectlocale=en-US&redirectslug=RhinoDownload

js.jar罐子是你在zip需要什么。 js-14是一个更大的java 1.4兼容版本,你不需要。

集成很简单,只需将jar文件夹入libs文件夹即可。

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

Rhino没有附带DOM,并且env.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()); 
+1

嗨,我很好奇它有多慢。你能分享一些你得到的数字结果吗?提前致谢。 – yhpark 2013-09-22 07:03:25

+1

极端,我用它来解析html。有些东西需要原生代码,1到2秒对于犀牛来说需要45秒。 – 2013-09-22 07:54:03

+1

@yhpark如果你能够提出问题以便其他人不认为这是一个无效问题,那将是非常好的。我是连续downvoting的受害者,我认为如果这个问题和答案是有用的,它不应该坐在一个否定:) – 2013-09-22 08:23:51