Android中的AsyncTask的 簡單使用

AsyncTask是什麼

  • AsyncTask是一個抽象類,它是Android封裝的一個輕量級(使用方便,代碼簡介)異步類,它可以在線程中執行後臺任務,然後把執行的進度和最終結果傳遞給主線程並在主線程中更新UI。
  • AsyncTask是一個抽象泛型類,它有三個泛型參數
    Params:開始異步執行時傳入的參數類型
    Progress:異步任務執行過程中,返回下載的進度值的類型
    Result:異步任務執行完成後,返回結果類型
    如果不需要傳遞具體的參數,則可以用Void來代替

AsyncTask怎麼用

在Activity中採用內部類繼承AsyncTask使用,讓後使用裏面的方法

 class DownlondTask extends AsyncTask<String, String,String>//括號內爲三個泛型參數,在這裏用來String

AsyncTask各個方法的作用

onPreExecute():這個方法會在後臺任務開始執行之間調用,在主線程執行。用於進行一些界面上的初始化操作,比如顯示一個進度條對話框等
doInBackground(Params):在這個方法中所有的代碼就會在子線程中運行
注意的是在這個方法中是不能對UI進行操作的
onPostExecute(Result):該方法當doInBackground執行完畢後並通過return語句返回時調用,返回的參數會傳遞到此方法中
onProgressUpdate(Progress…):調用publishProgress()方法後,這個參數就會很快的被調用,方法中攜帶的參數就是在後臺任務中傳遞過來的。 在這個方法中可以進行對UI的操作,在主線程中進行,利用參數中的數值就可以對界面元素進行相應的更新
上面幾個方法的調用順序:
onPreExecute() –> doInBackground() –> publishProgress() –> onProgressUpdate() –> onPostExecute()

什麼是泛型參數

泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。

什麼是長度可變的參數列表

protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            tv_show.setText(values[0]);
        }

上述代碼中的String… values,String…可以說是一個長度可變的String類型的參數,所以values我們要寫成一個數組

public void  add(int...ints){

    }
add(1,2,3,4,5)

我們可以在 add方法中無限的添值

案列解析–倒計時Demo

package com.example.dfcn.sexmouth;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class AsyncTaskActivity extends AppCompatActivity {
private TextView tv_show;
private Button btn_start;
private int time=10;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_async_task);
        tv_show=findViewById(R.id.tv_show);
        btn_start=findViewById(R.id.btn_start);
        btn_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DownlondTask().execute();//開始執行AsyncTask
            }
        });
    }


    class DownlondTask extends AsyncTask<String, String,String>{



        @Override
        /**
         * 在這個方法中所有的代碼就會在子線程中運行
         * 注意的是在這個方法中是不能對UI進行操作的
         */
        protected String doInBackground(String... strings) {
            while (time>0) {
                publishProgress(time+"");
                try {
                    Thread.sleep(1000);
                    time--;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            String s="下載完成";
            return String.valueOf(s);
        }

        @Override
        /**
         * 該方法當doInBackground執行完畢後並通過return語句返回時調用,返回的參數會傳遞到此方法中
         */
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            tv_show.setText(s);
        }

        @Override
        /**
         * 調用publishProgress()方法後,這個參數就會很快的被調用,方法中攜帶的參數就是在後臺任務中傳遞過來的。
         * 在這個方法中可以進行對UI的操作,在主線程中進行,利用參數中的數值就可以對界面元素進行相應的更新
         */

        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            tv_show.setText(values[0]);
        }
    }

}

這裏寫圖片描述這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章