Android --AsyncTask異步任務(一)


1.為什么要異步任務

  • Android單線程模式
  • 耗時操作放在非主線程(UI線程)中執行

  我們都知道Android是單線程模式,只有主線程才能對UI操作,簡稱UI線程。當然這樣的好處是:保證UI的穩定性、准確性,避免多線程同時對UI的操作,導致UI的混亂
  但同時Android是一個多線程的操作系統,不可能把全部的事情放在主線程。如果任務堵塞,當時間過長,會拋出ANR(Application Not Responding)錯誤。


2.AsyncTask為何而生

  • 子線程中更新UI
  • 封裝、簡化異步操作


3.構建AsyncTask子類的參數
  AsyncTask<Params,Progress,Result>是一個抽象類,通常用於被繼承,繼承AsyncTask需要指定如下三個泛型參數:

  • Params : 啟動任務時輸入參數的類型。
  • Progress : 后台任務執行中返回進度值的類型
  • Result : 后台執行任務完成后返回結果的類型

4.構建AsyncTask子類的回調方法

  • doInBackground : 必須重寫,異步執行后台程序將要完成的任務。
  • onPreExecute : 執行后台耗時操作前被調用,通常用戶完成一些初始化操作。
  • onPostExecute : 當doInBackground() 完成后,系統自動調用onPostExecute()方法,並將doInBackground方法返回的值傳給該方法
  • onProgressUpdate : 在doInBackground() 方法調用publishProgress() 方法更新任務的執行進度后,就會觸發該方法

 

現在我們來寫一個測試類:

import android.os.AsyncTask;
import android.util.Log;

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

    @Override
    protected Void doInBackground(Void... params) {
        
        Log.i("Task", "doInbackgroun");
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        
        Log.i("Task", "onPostExecute");
        super.onPostExecute(result);
    }
    
    @Override
    protected void onPreExecute() {
        
        Log.i("Task", "onPreExecute");
        super.onPreExecute();
    }
    
    @Override
    protected void onProgressUpdate(Void... values) {
        
        Log.i("Task", "onProgressUpdate");
        super.onProgressUpdate(values);
    }
}

在MainActivity中引用:

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AsyncTaskTest task = new AsyncTaskTest();
        task.execute();
    }

當我們運行在模擬器上時:

根據上面的第四條所寫,我們在doInBackground中調用publshProgress方法,運行后發現多了一個onProgressUpdate

protected Void doInBackground(Void... params) {
        
        Log.i("Task", "doInbackgroun");
        publishProgress(params);
        return null;
    }

 

謝謝大家的關注。I love you not for who you are, but for who I am before you.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM