由於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