最近在Android開發中
Webview通過調用JavascriptInterface的方式與App互動
在互動的過程中,有些App上的操作時間會比較長,Web中調用的話會造成程式假死的情況
于是想到了如下幾種方式來實作
1、js多線程(js正常情況下隻支援單一線程,是以此方案被否決)
2、采用異步方式(此方案程式仍舊會假死)
3、采用Web Worker方式(此方案是HTML5中為支援多線程新出的一種方法)
此方案最終也被否決,是因為線程中無法使用alert和window等對象,同樣就不能調用app中的JavascriptInterface
但由于方案不錯,是以把實作方式貼出來,以備後飨。
其中getScriptPath可以實作web worker不引用外部js的方法
JS代碼:
function getScriptPath(foo) { return window.URL.createObjectURL(new Blob([foo.toString().match(/^s*functions*(s*)s*{(([sS](?!}$))*[sS])/)[1]], { type: 'text/javascript' })); }
var worker = new Worker(getScriptPath(function () {
self.addEventListener('message', function(e) {
var value = 0;
while(value <= e.data){
self.postMessage(value);
value++;
}
}, false);
}));
worker.addEventListener('message', function (e) {
document.getElementById("result1").innerHTML = e.data;
}, false);
worker.postMessage(10000);
HTML:
<div id="result1"></div>
最終采用Android的AsyncTask的方式來實作,詳細代碼就不描述
了解AsyncTask的方法就可以使用