天天看點

javascript 多線程Web Worker不引用外部js檔案的方法

最近在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的方法就可以使用