詳細解讀AsyncTask的黑暗面以及一種替代方案介紹了AsyncTask的一些注意事項以及存在的問題篱昔,參照AsyncTask寫了一個庫AsyncTaskScheduler。
特點
- 默認多個任務并行處理取董。
- 執(zhí)行單個任務無需使用線程池。
- 支持自定義線程池。
- 支持錯誤處如暖。
- 多個任務的管理管理方便翎朱。
- 支持任何線程處使用橄维,結果都會在UI線程處理。
方法介紹
很多方法都是和AsyncTask類似拴曲。
- doInBackground
- onProgressUpdate
- onExecuteSucceed
- onExecuteCancelled
- onExecuteFailed
發(fā)生異常時回調(diào)
使用
1.單個任務——是在單個線程里執(zhí)行争舞,不需要線程池。
SingleAsyncTask singleTask = new SingleAsyncTask<Void,String>() {
@Override
public String doInBackground() {
return null;
}
@Override
public void onExecuteSucceed(String result) {
super.onExecuteSucceed(result);
}
@Override
public void onExecuteFailed(Exception exception) {
super.onExecuteFailed(exception);
Log.i(TAG,"onExecuteCancelled:"+exception.getMessage()+Thread.currentThread());
}
};
singleTask.executeSingle();
//取消通過executeSingle執(zhí)行的任務
mSingleAsyncTask.cancel(true);
2.多個任務
//多個任務新建一個任務調(diào)度器
AsyncTaskScheduler mAsyncTaskScheduler = new AsyncTaskScheduler();
SingleAsyncTask singleTask1 = new SingleTask() { ... }澈灼;
SingleAsyncTask singleTask2 = new SingleTask() { ... }竞川;
SingleAsyncTask singleTask3 = new SingleTask() { ... };
...
//并行執(zhí)行多個任務
mAsyncTaskScheduler.execute(singleTask1)
.execute(singleTask2).execute(singleTask3).
//設置默認的線程池
Executor defaultPoolExecutor = ...
AsyncTaskScheduler mAsyncTaskScheduler = new AsyncTaskScheduler(Executor defaultPoolExecutor);
//取消通過AsyncTaskScheduler任務
mAsyncTaskScheduler.cancelAllTasks(true);
3.確保正確的取消任務以防止避免內(nèi)存泄露或其他問題