一:效果图
1.开始加载
2.加载中
3.取消加载
4.加载完成
二:使用AsyncTask
1.MainActivity.java代码
package com.hanjie.asynctask_2021_0412;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.AsynchronousChannelGroup;
public class MainActivity extends AppCompatActivity {
private ImageView start,cancel;
private TextView text;
private ProgressBar progressBar;
private ProgressTask pTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.tv_text);
progressBar = findViewById(R.id.progress_bar);
start = findViewById(R.id.iv_start);
cancel = findViewById(R.id.cancel);
pTask = new ProgressTask();
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (pTask.isCancelled()){
pTask = new ProgressTask();
}
pTask.execute();
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pTask.cancel(true);
}
});
}
//1.定义一个AsyncTask子类
//2.实例化子类
//3.启动
public class ProgressTask extends AsyncTask<Void,Integer,String>{
//执行线程任务之前的操作
@Override
protected void onPreExecute() {
super.onPreExecute();
text.setText("加载中...");
}
//接受输入的参数,执行任务中耗时操作,返回线程任务中的执行结果
@Override
protected String doInBackground(Void... voids) {
try {
for (int i=1;i<100;i++) {
publishProgress(i);
Thread.sleep(50);
}
return "加载完毕";
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
//在线程中显示线程任务的执行进度,在doInBackground方法中调用publishProgress方法则触发该方法
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
text.setText("加载..."+values[0]+"%");
}
//接受线程任务的执行结果,将执行结果显示到界面
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s!=null){
text.setText(s);
}
pTask= new ProgressTask();
}
//取消异步任务时触发该方法
@Override
protected void onCancelled() {
super.onCancelled();
text.setText("已取消");
progressBar.setProgress(0);
}
}
}
2.activity_main布局页面代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ffff">
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:progress="0"
android:layout_marginTop="30dp"
android:layout_centerInParent="true"
/>
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="还没开始哦!"
android:textSize="28sp"
android:layout_above="@id/progress_bar"
android:layout_centerHorizontal="true"
/>
<ImageView
android:id="@+id/iv_start"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/start"
android:layout_below="@id/progress_bar"
android:layout_marginTop="30dp"
android:layout_marginLeft="100dp"
/>
<ImageView
android:id="@+id/cancel"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/stop"
android:layout_below="@id/progress_bar"
android:layout_alignParentRight="true"
android:layout_marginTop="30dp"
android:layout_marginRight="100dp"
/>
</RelativeLayout>
注意:
1.Task的实例必须在UI thread中创建
2.主线程中执行execte()