【问题标题】:Running JavaScript within a Service in Android在 Android 的服务中运行 JavaScript
【发布时间】:2013-05-02 18:24:42
【问题描述】:

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

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

AFAIK,有 2 个选项?

  • 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 线程的情况下在 web 视图中运行 javascript 成功?

2) 如何从javascript中的函数获取结果,webview界面“addJavascriptInterface”是否支持加载参数并将其发送回java?

3) 如果以上任何一个都不可行.. 我想我会去买 Rhino,任何提示都会不胜感激,我只看到一些博客抱怨关于让它在 Android 上运行的问题并想知道如果某处维护了一个“转到”版本的 android。

【问题讨论】:

  • 为什么这被否决了。最后我付出了很多努力来解决这个问题,我相信很多开发人员都对在 Android 中使用脚本语言感兴趣......

标签: javascript android android-webview android-service rhino


【解决方案1】:

在服务的深处找不到任何关于 V8 的信息。

最终使用了 Rhino,但是提醒任何追随我脚步的人,它非常慢。

只需从 Rhino 的官方最新发行版中获取 jar,来自 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());

【讨论】:

  • 嗨,我很好奇它有多慢。你能分享一些你得到的数字结果吗?提前致谢。
  • Extreme,我用它来解析 html。对于需要原生代码的东西,对于 rhino 来说,1 到 2 秒需要 45 秒。
  • @yhpark 如果您能对这个问题投赞成票,这样其他人就不会认为这是一个无效的问题,那就太好了。我是连续投票的受害者,我认为如果这个问题和答案有用,它不应该与否定:)
  • 我也有和你一样的html解析情况!我现在没有在做,但是当我做的时候,我可能会在这里分享我的结果。谢谢
猜你喜欢
  • 2017-07-01
  • 2011-01-21
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多