【发布时间】:2014-03-15 19:53:39
【问题描述】:
由于 Webworkers 仅从 Android 4.4 开始实现,是否可以在应用程序代码中包含一个包装器,为包含的 WebView 提供此功能?
一个关于如何解决这个问题的例子真的很有帮助。
谢谢,
拉贾特
【问题讨论】:
标签: android webview web-worker
由于 Webworkers 仅从 Android 4.4 开始实现,是否可以在应用程序代码中包含一个包装器,为包含的 WebView 提供此功能?
一个关于如何解决这个问题的例子真的很有帮助。
谢谢,
拉贾特
【问题讨论】:
标签: android webview web-worker
我猜你说的是在后台运行一个 javascript 代码块,即不同的线程。曾尝试在 Android 上使用 RhinoJS 来做到这一点。在 Android 2.2 及更高版本上测试
https://github.com/devthon/SilentJSAndroid
主要特点是
- 在没有浏览器上下文的情况下执行 Javascript 代码
- 从脚本文件执行 Javascript 代码
- 在同一上下文中加载其他 JS 文件
- 在后台线程中执行方法并返回结果
- 执行 Object.Method() 调用
- 执行原型方法调用
- 应用关闭后在后台运行长时间运行的脚本。
可能不是一个成熟的网络工作者,因为它没有 API 来检查两者之间的状态。但是我相信仍然可以将其添加到界面中。
如果这是您正在寻找的方向,我可以详细解释它是如何完成的。
【讨论】:
您需要实施多少 Worker 规范,实施需要有多灵活?您可能可以使用 JavaScript 接口 [1] 启动并运行基本功能,并从 Java 本地生成线程。但是,这会很快变得复杂。
也许如果你能描述一下你使用工人的原因,我可能会提供一个不同/更好的建议。
[1] http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)
--
添加一些伪代码
在 JavaScript 中生成一个 Java 工作线程:
var worker_id = window.Android.spawnWorker();
在 JavaScript 中,在该 worker 上运行一个任务:
var task_id = window.Android.doAdditionOnWorker(2,2, worker_id);
在 JavaScript 中处理结果
function onReceiveResultForWorkerTask(task_id, result) {
alert("the answer was " + result);
}
Java端:
public int spawnWorker() {
HandlerThread worker = new HandlerThread();
worker.start();
Handler h = new Handler(worker.getLooper()) {
@Override
handleMessage(Message msg) {
switch(msg.what)
case ADD:
// calculate the answer and send back to JS via UI thread
// Unpack parameters and task id from Message
mWebView.post(new Runnable(
public void run() {
mWebView.loadUrl("javascript:onReceiveResultForWorkerTask(task_id, " + (a+b) +");");
}
)
}
};
mWorkerMap.put(mWorkerId++, h);
return mWorkerId;
}
public int doAdditionOnWorker(int a, int b, int worker_id) {
Handler h = mWorkerMap.get(worker_id);
Bundle b = new Bundle();
int task_id = mTaskId++;
// pack arguments and task_id into the bundle
h.postMessage(Message.obtain(h, ADD, b);
return task_id;
}
当应用不再需要它们时,不要忘记检查并拆除您生成的所有工作线程。根据您需要的工作线程数量,您可能还更喜欢使用线程池,而不是每次都创建新线程。
【讨论】: