AsyncTask

AsyncTask

AsyncTask是什麼?

  • AsyncTask是Android提供的輕量級的異步類,使用AsyncTask可以忽略Looper,MessageQueue,Handler等複雜對象,更便捷的完成異步耗時操作。

AsyncTask怎麼用?

  • 在activity中寫一個類部類繼承AsyncTask,並用onProgressUpdate, onPostExecute,onPreExecute,三個方法來運行。
class DownloadTask extends AsyncTask<String,String,String>{

        @Override
        protected String doInBackground(String... strings) {

                }
            }

            return "null";
        }
 protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            tvdownload.setText(values[0]);
        }
  protected void onPostExecute(String s) {
            super.onPostExecute(s);
            tvdownload.setText(s);
        }
 protected void onPreExecute() {
            super.onPreExecute();
            tvdownload.setText("正在下載");
        }
  • 以及放入點擊事件中的new DownloadTask().execute();
 btbegin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                 new DownloadTask().execute();
            }
        });

需要實現的幾個方法分別是什麼、有什麼用?

  • onPreExecute(),在異步任務執行完成前,系統會用此方法,此方法運行在主線程中,可以修改控件狀態,例如:正在下載。
  • doInBackground(Params…), 將在onPreExecute 方法執行後馬上執行,該方法運行在後臺線程中。這裏將主要負責執行那些很耗時的後臺計算工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
  • onProgressUpdate(Progress…),在publishProgress方法被調用後,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。
  • onPostExecute(Result), 當異步任務執行完成後,系統會用此方法,此方法運行在主線程中,可以修改控件狀態,例如:下載完成。

什麼是泛型參數?

  • 泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定爲一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱爲泛型類、泛型接口、泛型方法。

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

  • 可變長度參數列表,其語法就是類型後跟…,表示此處接受的參數爲0到多個Object類型的對象,或者是一個Object[]。

案例解析—倒計時Demo

  tvdownload=findViewById(R.id.tv_download);
        btbegin=findViewById(R.id.bt_begin);
        btbegin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                 new DownloadTask().execute();
            }
        });

    }
    class DownloadTask extends AsyncTask<String,String,String>{

        @Override
        protected String doInBackground(String... strings) {
            while (count>0){
                publishProgress(count+"");
                count--;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return "下載完成";
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            tvdownload.setText(values[0]);
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            tvdownload.setText(s);
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tvdownload.setText("正在下載");
        }

案例分析–進度條Demo

  • 先創建進度條ProgressBar,將圓型進度條變成長條形進度條
    <ProgressBar
        android:id="@+id/pb"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100" />
  • 接下來如上個案例演示差不多的流程,只是稍有不同,可以自己對比找不同。
btdj.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             new Downls().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
                btdj.setEnabled(false);//開始後按鈕失效

            }
        });
    }
        class  Downls extends AsyncTask<Integer,Integer,Integer> {
            @Override
            protected Integer doInBackground(Integer... strings) {
                  while (count<=100){
                      publishProgress(count,strings[0]);
                      count+=10;
                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
                return strings[0];

            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();

            }

            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                switch (values[1]){
                    case 1:
                        pb.setProgress(values[0]);
                        break;
                }

            }

            @Override
            protected void onPostExecute(Integer s) {
                super.onPostExecute(s);
                btdj.setText(s);
                btdj.setEnabled(true);//結束後恢復按鈕
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章