2014-03-07 58 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