AsyncTask實現非同步任務執行

welchang發表於2021-09-09

AsyncTask實現非同步任務執行
檢視原始碼AsyncTask只是對Thread和Handler的一個封裝。

基本概念
3個泛型引數
AsyncTask <Params, Progress, Result>
Params: 指定的是我們傳遞給非同步任務執行時的引數的型別
Progress: 指定的是我們的非同步任務在執行的時候將執行的進度返回給UI執行緒的引數的型別
Result: 指定的是非同步任務執行完後返回給UI執行緒的結果的型別
我們在定義一個類繼承AsyncTask類的時候,必須指定好這三個泛型的型別,如果都不指定的話,則都將其寫成Void
4個執行步驟
onPreExecute():UI Thread當中執行,這個方法是在執行非同步任務之前的時候執行,我們可以在非同步任務執行前做UI提示
doInBackground(Params... params):這個方法就是來處理非同步任務的方法,執行耗時操作。這個方法也是必須要實現的抽象方法。
onProgressUpdate(Progess... values):UI Thread當中執行,用來更新進度條等
onPostExecute(Result... result):UI Thread當中執行,當非同步任務執行完之後,將doInBackground結果返回給這個方法來更新UI
2種執行方式
後臺執行緒可以設定為序列或者並行執行
序列:execute(Params... params)
並行:executeOnExecutor(Executor exec, Params... params)
注意:各SDK版本execute預設執行方式不統一,1.5中順序執行,1.6到 2.3中並行執行,3.0以後又改回序列執行,並新增並行執行介面executeOnExecutor
注意事項
必須在UI執行緒中載入和建立,以及呼叫execute
不能做特別耗時的操作,建議只幾秒內的非同步任務
一個AsyncTask物件只能被執行一次,即只能呼叫一次execute,否則會丟擲異常報錯
Caused by: java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
不能在程式中主動呼叫4個步驟
程式碼示例
// 初始化AsyncTask及執行
protected void function() {
...
// 序列執行,識別一張bitmap,每次執行前都需要重新new一個物件
mClassifierAsyncTask = new ClassifierAsyncTask();
mClassifierAsyncTask.execute(bitmap);
}

// 自定義AsyncTask任務類,實現doInBackground
private ClassifierAsyncTask mClassifierAsyncTask;
private class ClassifierAsyncTask extends AsyncTask<Bitmap , Void, String >{

@Overrideprotected void onPreExecute() {    super.onPreExecute();
    mTvResult.setText(getString(R.string.classifying));
}@Overrideprotected String doInBackground(Bitmap... bitmaps) {    if(mMyTfClassifier == null) {
        mMyTfClassifier = new MyTfClassifier(MainActivity.this);
    }
    String result = mMyTfClassifier.recognizeImage(bitmaps[0]);    return result;
}@Overrideprotected void onPostExecute(String result) {    super.onPostExecute(result);
    mTvResult.setText(result);
}

}
存在的問題
Activity螢幕旋轉或銷燬時,如果AsyncTask沒有執行完畢就會存在記憶體洩露。特別是螢幕旋轉時AsyncTask沒有執行完畢,會導致螢幕異常。



作者:凱恩_Kane
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4830/viewspace-2822123/,如需轉載,請註明出處,否則將追究法律責任。

相關文章