gpt4 book ai didi

javascript - 在 Android 服务中运行 JavaScript

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:52:47 25 4
gpt4 key购买 nike

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

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

据我所知,有 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 线程的情况下在 webview 中成功运行 javascript?

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

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

最佳答案

无法从服务的深处找到与 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());

关于javascript - 在 Android 服务中运行 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16442093/

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