android之AsyncTask

AsyncTask和Handler對比java

1 ) AsyncTask實現的原理,和適用的優缺點android

AsyncTask,是android提供的輕量級的異步類,能夠直接繼承AsyncTask,在類中實現異步操做,提供接口反饋當前異步執行的程度(能夠經過接口實現UI進度更新),最後反饋執行的結果給UI主線程.異步

使用的優勢:ide

l  簡單,快捷oop

l  過程可控spa

使用的缺點:線程

l  在使用多個異步操做和並須要進行Ui變動時,就變得複雜起來.code

2 )Handler異步實現的原理和適用的優缺點對象

在Handler 異步實現時,涉及到 Handler, Looper, Message,Thread四個對象,實現異步的流程是主線程啓動Thread(子線程)àthread(子線程)運行並生成Message-àLooper獲取Message並傳遞給HandleràHandler逐個獲取Looper中的Message,並進行UI變動。繼承

使用的優勢:

l  結構清晰,功能定義明確

l  對於多個後臺任務時,簡單,清晰

使用的缺點:

l  在單個後臺異步處理時,顯得代碼過多,結構過於複雜(相對性)

AsyncTask介紹
Android的AsyncTask比Handler更輕量級一些,適用於簡單的異步處理。
首先明確Android之因此有Handler和AsyncTask,都是爲了避免阻塞主線程(UI線程),且UI的更新只能在主線程中完成,所以異步處理是不可避免的。

Android爲了下降這個開發難度,提供了AsyncTask。AsyncTask就是一個封裝過的後臺任務類,顧名思義就是異步任務。

AsyncTask直接繼承於Object類,位置爲android.os.AsyncTask。要使用AsyncTask工做咱們要提供三個泛型參數,並重載幾個方法(至少重載一個)。

AsyncTask定義了三種泛型類型 Params,Progress和Result。

  • Params 啓動任務執行的輸入參數,好比HTTP請求的URL。
  • Progress 後臺任務執行的百分比。
  • Result 後臺執行任務最終返回的結果,好比String。

使用過AsyncTask 的同窗都知道一個異步加載數據最少要重寫如下這兩個方法:

  • doInBackground(Params…) 後臺執行,比較耗時的操做均可以放在這裏。注意這裏不能直接操做UI。此方法在後臺線程執行,完成任務的主要工做,一般須要較長的時間。在執行過程當中能夠調用publicProgress(Progress…)來更新任務的進度。
  • onPostExecute(Result)  至關於Handler 處理UI的方式,在這裏面可使用在doInBackground 獲得的結果處理操做UI。 此方法在主線程執行,任務執行的結果做爲此方法的參數返回

有必要的話你還得重寫如下這三個方法,但不是必須的:

  • onProgressUpdate(Progress…)   可使用進度條增長用戶體驗度。 此方法在主線程執行,用於顯示任務執行的進度。
  • onPreExecute()        這裏是最終用戶調用Excute時的接口,當任務執行以前開始調用此方法,能夠在這裏顯示進度對話框。
  • onCancelled()             用戶調用取消時,要作的操做

使用AsyncTask類,如下是幾條必須遵照的準則:

  • Task的實例必須在UI thread中建立;
  • execute方法必須在UI thread中調用;
  • 不要手動的調用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)這幾個方法;
  • 該task只能被執行一次,不然屢次調用時將會出現異常;
一個簡單的示例
new AsyncTask<Void, Void, Void>() {
    //刷新過程當中須要作的操做在這裏
    protected Void doInBackground(Void... params)
    {
        try 
        {
            Thread.sleep(1000);
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        data.add("new item");
        return null;
    }
    //刷新完成後要通知listview進行界面調整
    @Override
    protected void onPostExecute(Void result) 
    {
        adapter.notifyDataSetChanged();
        listView.onRefreshComplete();
    }

}.execute(null);
相關文章
相關標籤/搜索