2013年5月23日 星期四

Android AsyncTask 寫成獨立class 並且不讓程式邏輯跳來跳去

用這樣的寫法可以將開始AsyncTask 和AsyncTask結束後要如何更新ui的code寫在一起.

避免程式破碎.



strategy pattern:

因為java沒有function pointer, 這裡就把strategy pattern當作function pointer來用




首先建立一個interface之後做call back用:


public interface MyCallBack {
public void onTaskComplete(Object p);
}


建立一個class 繼承AsyncTask


public class DownloadTask extends AsyncTask<Void, Void, Void> {

    MyCallBack callBack;
    ReturnObject ret;   //耗時工作的回傳值    
    public DownloadPackageListTask(MyCallBack pCallBack) {
    callBack = pCallBack;
}
    
@Override
protected Void doInBackground(Void... params) {

ret = (網路傳輸之類的function,最後得到回傳值)

return null;
}


@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
callBack.onTaskComplete(ret); 
}
}


有了以上一個interface跟一個asynctask的subcalss後,我們就可以在main thread 中這樣使用:


final DownloadTask task = new DownloadTask(
new MyCallBack() { //藉由MyCallBack interface建立一個 anonymous 的strategy class

@Override
public void onTaskComplete(Object p) {
ReturnObject ro = (ReuturnObject)p;

(可以將得到return object後的ui code直接寫在這裡, 這個block內的東西將會在asynctask 的 onPostExecute中執行)

});

task.execute();



如此就可以直接把開始執行耗時工作和執行完耗時工作要做的事情寫在一起了!

沒有留言:

張貼留言