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);

results matching ""

    No results matching ""