由于Webworkers仅从Android 4.4开始实现,是否有可能在包含WebView的应用程序代码中提供此功能的包装?在Android Kitkit前模拟Web Workers
一个关于如何解决这个问题的例子确实有帮助。
感谢,
Rajath
由于Webworkers仅从Android 4.4开始实现,是否有可能在包含WebView的应用程序代码中提供此功能的包装?在Android Kitkit前模拟Web Workers
一个关于如何解决这个问题的例子确实有帮助。
感谢,
Rajath
我想你是说在后台运行一个JavaScript代码块,即不同的线程。试过在Android上使用RhinoJS。经测试在Android 2.2及以上
https://github.com/devthon/SilentJSAndroid
主要特点是
- 执行JavaScript代码,而无需浏览器上下文
- 从脚本文件执行JavaScript代码
- 放入其他JS文件在相同的背景下
- 在后台线程执行一个方法ret瓮结果
- 执行一个的object.method()调用
- 在后台中执行的原型方法调用
- 运行长期运行的脚本应用程序被关闭之后。
可能不是一个完全成熟的Web工人正因为如此,因为它没有API来检查之间的状态。但是,这仍然可以添加到我相信的界面中。
如果这是您正在寻找的方向,我可以更多地解释它是如何完成的。
如何工人规范的钱你需要实现,以及如何不灵活的实施需要呢?您可能可以使用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 ,在该工作人员上运行一项任务:
处理结果在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;
}
不要忘了办理和拆除,你产卵时,应用程序并不需要它们的所有工作线程了。根据您需要的工作人员数量,您可能更喜欢使用线程池,而不是每次都创建新线程。
我们使用addJavascriptInterface()来注入一个从Javascript代码中调用的Java对象。这个JS层调查一个函数来获取Java层需要发送的任何挂起的消息(以避免使用loadUrl())。 – rajath
针对您的具体问题,并考虑到我们正在使用轮询方法(如我以前的评论中给出的那样),有没有办法使用不同的Java线程来模拟Webworkers? – rajath
那么,您可以产生一个Java线程来响应JavaScript的回调,并将该线程的标识符返回给您的JavaScript。然后,JavaScript可以使用标识符将消息发送到该Java线程,并再次通过JavaScript接口返回。我猜Java本地线程会运行一个Handler来接收要做什么的消息。 – ksasq
感谢Aravind。我想这就是我正在寻找的 - 会试一试。 – rajath
只是想添加一些可能对其他人有用的URL:1)http://divineprogrammer.blogspot.com/2009/11/javascript-rhino-on-android.html,2)http://openaphid.github。 io/blog/2013/01/17/part-i-how-to-choose-a-javascript-engine-for-ios-and-android-apps /,3)https://developer.mozilla.org/en -US /文档/犀牛/ Download_Rhino – rajath