1. 程式人生 > >AsyncTack 抽象類 (附 倒計時,進度條 程式碼、Handler的區別)

AsyncTack 抽象類 (附 倒計時,進度條 程式碼、Handler的區別)

1.什麼是AsyncTask?

這裡寫圖片描述
它與Handler 的區別在於*沒有在* 子執行緒中傳送Message

AsyncTask 有三種泛型引數:(泛型就是 int,String boolean 等一切引數)
Params 啟動任務執行的 輸入引數。
Progress 後臺任務執行的 百分比。
*Result 後臺執行任務最終返回的結果

在AsynTask裡有幾種常用方法:

onPreExecute(){}:
該方法將在執行實際的後臺操作前被UI
執行緒呼叫。可以在該方法中做一些準備工作,此方法執行在主執行緒

dolnBackground(){}:
onPreExecute方法執行後

馬上執行,此方法執行在子執行緒中,,比較耗時的操作放在此方法中執行。

onProgressUpdate:在publishProgress方法被呼叫後,UI 執行緒將呼叫這個方法從而在介面上展示任務的進展情況;
比如需要實時顯示進度的需求。

onPostExecute(Result):
doInBackground執行完成 後onPostExecute 方法將被UI
執行緒呼叫,後臺的計算結果將通過該方法傳遞到UI 執行緒,可以修改控制元件狀態,類如:下載完成

2.用AsyncTask 步驟:

1,新建內部類 **繼承**AsyncTask;
2,定義AsyncTask的三種

泛型引數;
3,重寫dolnBaxkground 抽象方法;
4,重寫onPreExecute方法;
5,重寫onProgressupdate
6,重寫onPostExecute方法;
7,在需要啟動的地方,使用execute方法,

這裡寫圖片描述
這裡寫圖片描述

3.使用AsyncTask做倒計時(附程式碼)

package com.example.lenovo.myapplication;

import android.os.AsyncTask;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import
android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Main3Activity extends AppCompatActivity { private EditText editText; private TextView textView; private Button button; private int time; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); binID(); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Demo().execute(); } }); } private void binID() { editText=findViewById(R.id.main_editText); button=findViewById(R.id.main_button); textView=findViewById(R.id.main_textview_1); } class Demo extends AsyncTask<Integer,Integer,String>{ @Override protected void onPreExecute() { super.onPreExecute(); textView.setText("計時開始"); } @Override protected String doInBackground(Integer... integers) { time=Integer.parseInt(editText.getText().toString()); for(int i=time;i>=0;i--){ try { Thread.sleep(1000); publishProgress(i); //呼叫的是onProgressUpdate 方法 } catch (InterruptedException e) { e.printStackTrace(); } } return "計時結束"; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); textView.setText(values[0]+""); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); textView.setText(s); } } }

xml 佈局程式碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.lenovo.myapplication.Main3Activity">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp">

        <TextView
            android:id="@+id/main_textview"
            android:layout_width="180dp"
            android:layout_height="50dp"
            android:text="設定時間為"
            android:textSize="35dp"
            />
        <EditText
            android:id="@+id/main_editText"
            android:layout_toRightOf="@id/main_textview"
            android:layout_width="50dp"
            android:layout_height="50dp" />
        <TextView
            android:layout_toRightOf="@id/main_editText"
            android:id="@+id/main_textview2"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:text="秒"
            android:textSize="35dp"
            />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_centerInParent="true"
        android:orientation="horizontal"
        >

        <TextView
            android:id="@+id/main_textview3"
            android:layout_width="150dp"
            android:layout_height="50dp"
            android:text="倒計時:"
            android:textSize="35dp"
            android:layout_centerInParent="true"
            />
        <TextView
            android:textSize="35dp"
            android:id="@+id/main_textview_1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"

            />

    </LinearLayout>
    <Button
        android:layout_gravity="center"
        android:text="開始計時"
        android:id="@+id/main_button"
        android:layout_width="80dp"
        android:layout_height="50dp"/>


</LinearLayout>

效果圖:
這裡寫圖片描述

執行圖:
這裡寫圖片描述

4.使用AsyncTask做進度條(附程式碼)

xml程式碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.lenovo.myapplication.Main4Activity">


    <ProgressBar
        android:id="@+id/main_progress"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="45dp"
        android:max="100"

        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="horizontal">

        <TextView

            android:layout_width="80dp"
            android:layout_height="40dp"
            android:text="下載進度" />

        <TextView
            android:id="@+id/main_textView_jindu"
            android:layout_width="wrap_content"
            android:layout_height="40dp" />


    </LinearLayout>


    <Button
        android:id="@+id/main_start_btn"

        android:layout_width="150dp"
        android:layout_height="50dp"

        android:text="開始下載" />





</LinearLayout>

java程式碼:

package com.example.lenovo.myapplication;

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.ProgressBar;
import android.widget.TextView;

public class Main4Activity extends AppCompatActivity {
    private ProgressBar progressBar;
    private Button button_start;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        binID();
        button_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Demo().execute(100);
                button_start.setEnabled(false);
            }
        });

    }

    private void binID() {
        progressBar = findViewById(R.id.main_progress);
        button_start = findViewById(R.id.main_start_btn);
        textView = findViewById(R.id.main_textView_jindu);
    }

    class Demo extends AsyncTask<Integer, Integer, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            button_start.setText("正在下載");


        }

        @Override
        protected String doInBackground(Integer... integers) {
            for (int i = 0; i <= 100; i++) {

                progressBar.setProgress(i);
                try {
                    Thread.sleep(integers[0]);
                    publishProgress(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }


            return "執行完畢";
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            textView.setText(values[0] + "%");
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            button_start.setText(s);
            button_start.setEnabled(true);
        }
    }


}

效果:
這裡寫圖片描述

Execute()和executeOnExecutor 有何區別?

execute()只是在序列下 執行
execteOnExecutor() 只是在並行下執行
不過在此執行緒的時候 ,只能同時執行5個執行緒

Handler和AsyncTask的區別:
使用Handler需要了解5個物件,程式碼量大,邏輯較為複雜
使用AsyncTask只需要瞭解3個引數,幾個方法即可。程式碼量小,結構清晰。

我更喜歡AsyncTask 因為他操作方便,相比Handler較為簡單。之間只需要注意幾種方法,和耗時操作
上下連線點,publishprogress的直接呼叫 即可