AsyncTask
在處理非同步的工作與網路請求時,建議使用AsyncTask來處理,其中已經完整定義執行流程函式,以比較簡單方便的方式在背景執行達到非同步任務的方法。好處是可直接處理UI的顯示。不必費心在Handler傳送跟Message處理。
下列為AsyncTask基本架構,其中參數類型可依需求變動
class MyAsyncTask extends AsyncTask<Object, Integer, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// 背景工作處理"前"需作的事
}
@Override
protected String doInBackground(Object... prams) {
// 處理工作
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!isCancelled()) {
//傳送進度至onProgressUpdate中
publishProgress(val);
return doSomething();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
// 背景工作處理"中"更新的事
}
@Override
protected void onPostExecute(Object res) {
super.onPostExecute(res);
// 背景工作處理完"後"需作的事
}
@Override
protected void onCancelled() {
super.onCancelled();
// 背景工作被"取消"時作的事,此時不作 onPostExecute(String result)
}
}
另外執行多個AsyncTask,預設為按先後順序每次只運行一個。也就是說它是按提交的次序,每次只啟動一個線程執行一個任務,完成之後再執行第二個任務。若需要同時進行的話,需使用下列方式
MyAsyncTask task = new MyAsyncTask();
// 預設執行方式,為循序方式
//task.execute(new String[0]);
//循序
task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, Object... objs);
//並行
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object... objs);