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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AsyncTask非同步任務類非同步
- Android中非同步任務(AsyncTask)Android非同步
- Android的AsyncTask非同步任務淺析Android非同步
- 同步任務與非同步任務執行順序非同步
- 深入理解安卓非同步任務AsyncTask安卓非同步
- Spring Boot @Async 非同步任務執行Spring Boot非同步
- Springboot非同步任務執行緒池Spring Boot非同步執行緒
- Django配置celery執行非同步任務和定時任務Django非同步
- PHP定時執行任務的實現PHP
- 用CompletableFuture實現非同步任務非同步
- Python實現投遞多執行緒任務Python執行緒
- 實現一個併發任務執行框架框架
- crontab+shell 實現每秒執行一個任務
- Java多執行緒並行處理任務的實現Java執行緒並行
- Android後臺任務(HandlerThread、AsyncTask、IntentService)AndroidthreadIntent
- Java實現終止執行緒池中正在執行的定時任務Java執行緒
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- AsyncTask實現原理
- Java非同步判斷執行緒池所有任務是否執行完成的方法Java非同步執行緒
- celery 與 flask 實現非同步任務排程Flask非同步
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- Java CompletableFuture:allOf等待所有非同步執行緒任務結束Java非同步執行緒
- Java併發實戰(六) 任務執行Java
- 後臺程式在處理繁重的任務時,呼叫外部程式非同步執行的簡單實現非同步
- 如何在Java中實現非同步任務排程?Java非同步
- 批量任務體現多執行緒的威力!執行緒
- golang runtime實現多核並行任務Golang並行
- suging閒談-netty 的非同步非阻塞IO執行緒與業務執行緒分離Netty非同步執行緒
- Android 多執行緒-----AsyncTask詳解Android執行緒
- laravel框架任務排程(定時執行任務)Laravel框架
- 微任務和巨集任務哪個先執行
- 9.2 運用API實現執行緒同步API執行緒
- [譯] 在 Flask 中使用 Redis Queue 實現非同步任務FlaskRedis非同步
- php:多程式執行任務PHP
- IDEA上執行Flink任務Idea
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 【進階之路】執行緒池擴充與CompletionService操作非同步任務執行緒非同步