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的直接呼叫 即可