您好,登錄后才能下訂單哦!
當(dāng)UI(主)線程運行時間過長時,系統(tǒng)會出現(xiàn)ANR(Application No Response),為了避免這種情況,就需要將耗時操作設(shè)在非主線程中進(jìn)行,這樣也能保證Android的單線程模型。
Android提供了一個封裝好的控件--AsyncTask,來完成這些操作,其能在子線程中更新UI,能封裝,簡化異步操作
AsyncTask<Params,Progress,Result>是一個抽象類,通常用于被繼承,繼承時需要指定以下三個泛型參數(shù):
1.Params:啟動任務(wù)時輸入的參數(shù)類型
2.后臺任務(wù)執(zhí)行中返回進(jìn)度值的類型
3.后臺執(zhí)行任務(wù)完成后返回結(jié)構(gòu)的類型
構(gòu)建AsyncTask子類有以下回調(diào)方法
因為此例子為簡單舉例,所以AsyncTask的三個參數(shù)不需要返回值,所以設(shè)為Void
要啟動AsyncTask還需要在主函數(shù)中調(diào)用.execute();方法
例如:
要使用AsyncTask,還需要在主函數(shù)中,定義一個先前創(chuàng)建好的AsyncTask的子類方法,例如上文的MyAsyncTask
舉例如下:
這舉例是訪問網(wǎng)絡(luò)上一張圖片,把耗時的訪問加載圖片等操作放在AsyncTask中,因為訪問了網(wǎng)絡(luò),不要忘了在AndroidManifest中添加訪問網(wǎng)絡(luò)的Permission
注意:由于一個線程沒有結(jié)束,下一個線程是沒法進(jìn)行的,是需要等上一個進(jìn)程完成后才能進(jìn)行的,所以當(dāng)想進(jìn)行下一個線程時,可以采取AsyncTask.cancel(true)的方法結(jié)束當(dāng)前線程,然后再執(zhí)行的步驟中,判斷如果isCancelled(),就不要再繼續(xù)執(zhí)行任務(wù),直接break,然后再去進(jìn)行下一個線程
每個AsyncTask只能調(diào)用一次,多次調(diào)用會拋出異常
AsyncTask的四個方法中,只有doInBackground()是運行在其它線程,其它三個是運行在主線程,所以doInBackground()不能直接更新UI,需要通過onPostExecute()或onProgressUpdate()方法更新UI
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。