2014-03-07 25 views
1

由于Webworkers仅从Android 4.4开始实现,是否有可能在包含WebView的应用程序代码中提供此功能的包装?在Android Kitkit前模拟Web Workers

一个关于如何解决这个问题的例子确实有帮助。

感谢,
Rajath

回答

1

我想你是说在后台运行一个JavaScript代码块,即不同的线程。试过在Android上使用RhinoJS。经测试在Android 2.2及以上

https://github.com/devthon/SilentJSAndroid

主要特点是

  1. 执行JavaScript代码,而无需浏览器上下文
  2. 从脚本文件执行JavaScript代码
  3. 放入其他JS文件在相同的背景下
  4. 在后台线程执行一个方法ret瓮结果
  5. 执行一个的object.method()调用
  6. 在后台中执行的原型方法调用
  7. 运行长期运行的脚本应用程序被关闭之后。

可能不是一个完全成熟的Web工人正因为如此,因为它没有API来检查之间的状态。但是,这仍然可以添加到我相信的界面中。

如果这是您正在寻找的方向,我可以更多地解释它是如何完成的。

+0

感谢Aravind。我想这就是我正在寻找的 - 会试一试。 – rajath

+0

只是想添加一些可能对其他人有用的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

0

如何工人规范的钱你需要实现,以及如何不灵活的实施需要呢?您可能可以使用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; 
} 

不要忘了办理和拆除,你产卵时,应用程序并不需要它们的所有工作线程了。根据您需要的工作人员数量,您可能更喜欢使用线程池,而不是每次都创建新线程。

+0

我们使用addJavascriptInterface()来注入一个从Javascript代码中调用的Java对象。这个JS层调查一个函数来获取Java层需要发送的任何挂起的消息(以避免使用loadUrl())。 – rajath

+0

针对您的具体问题,并考虑到我们正在使用轮询方法(如我以前的评论中给出的那样),有没有办法使用不同的Java线程来模拟Webworkers? – rajath

+0

那么,您可以产生一个Java线程来响应JavaScript的回调,并将该线程的标识符返回给您的JavaScript。然后,JavaScript可以使用标识符将消息发送到该Java线程,并再次通过JavaScript接口返回。我猜Java本地线程会运行一个Handler来接收要做什么的消息。 – ksasq