AsyncTask實現非同步任務執行
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android執行緒管理之AsyncTask非同步任務Android執行緒非同步
- AsyncTask非同步任務類非同步
- Android中非同步任務(AsyncTask)Android非同步
- 同步任務與非同步任務執行順序非同步
- 深入理解安卓非同步任務AsyncTask安卓非同步
- Android的AsyncTask非同步任務淺析Android非同步
- MemQ 實現非同步任務MQ非同步
- Django配置celery執行非同步任務和定時任務Django非同步
- PHP定時執行任務的實現PHP
- Spring Boot @Async 非同步任務執行Spring Boot非同步
- 實現一個併發任務執行框架框架
- 用CompletableFuture實現非同步任務非同步
- Django 使用 Celery 實現非同步任務Django非同步
- Springboot非同步任務執行緒池Spring Boot非同步執行緒
- Android 非同步任務知識梳理(1) AsyncTask 原始碼解析Android非同步原始碼
- crontab+shell 實現每秒執行一個任務
- Python實現投遞多執行緒任務Python執行緒
- Java多執行緒並行處理任務的實現Java執行緒並行
- Android非同步任務類實現方案Android非同步
- Spring 非同步執行緒池、排程任務執行緒池配置Spring非同步執行緒
- Swoole來實現實時非同步任務佇列非同步佇列
- Java實現終止執行緒池中正在執行的定時任務Java執行緒
- celery 與 flask 實現非同步任務排程Flask非同步
- redhat 9.0 中任務自動執行的實現方式 (轉)Redhat
- Java非同步判斷執行緒池所有任務是否執行完成的方法Java非同步執行緒
- AsyncTask 處理複雜多個任務。
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- Java併發實戰(六) 任務執行Java
- 任務執行順序
- Python多執行緒非同步任務佇列(例項)Python執行緒非同步佇列
- 如何在Java中實現非同步任務排程?Java非同步
- 後臺程式在處理繁重的任務時,呼叫外部程式非同步執行的簡單實現非同步
- 批量任務體現多執行緒的威力!執行緒
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- Android探索之旅 | 用AsyncTask實現多執行緒+例項Android執行緒
- laravel框架任務排程(定時執行任務)Laravel框架
- 微任務和巨集任務哪個先執行
- AsyncTask實現原理