使用 AsyncTask 完成一个模拟的进度条功能

问题描述:

  • 使用 AsyncTask 完成一个模拟的进度条功能,界面原型如下图所示。
  • 【Android 练习】AsyncTask异步_xml

备注:
(1)要求使用 AsyncTask 类完成线程功能;
(2)考生按照系统提示目录保存试题文件,每道试题建立一个文件夹,文
件夹名为题目编号。该试题文件夹名为“2”,该文件夹内应包含5个文件,分别为:
 整个项目压缩包文件:App2.zip
 主界面描述文件:activity_main.xml
 程序逻辑文件:MainActivity.java 程序运行截图界面:1.png、2.png


TestActivity.xml

【Android 练习】AsyncTask异步_android_02

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AsyncTask.TestActivity"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="3dp"
android:layout_marginTop="9dp"
android:text="开始执行异步线程:"
android:textSize="18dp"
android:textStyle="bold" />
<ProgressBar
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginTop="52dp" />
<Button
android:id="@+id/bt_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="149dp"
android:layout_marginTop="85dp"
android:text="启动" />
</RelativeLayout>

DownLoad.java — 模拟下载网络延迟

package com.example.learning.AsyncTask;

public class DownLoad {

// 延时操作,模拟下载
public void delay(){
try {
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
}
}

MyAsyncTask.java

package com.example.learning.AsyncTask;

import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MyAsyncTask extends AsyncTask<Integer, Integer, String> {

private TextView txt1;
private ProgressBar progressBar2;

public MyAsyncTask(TextView txt1, ProgressBar progressBar2) {
this.txt1 = txt1;
this.progressBar2 = progressBar2;
}

// 该方法不运行在UI线程中,主要用于异步操作,通过调用publishProgress()方法
// 触发onProgressUpdate对UI进行操作
@Override
protected String doInBackground(Integer... integers) {
DownLoad downLoad = new DownLoad();
int i = 0;
for (i = 10; i <= 100; i += 10) {
downLoad.delay();
publishProgress(i);
}
return i + integers[0].intValue() + "";
}

//该方法运行在UI线程中,可对UI控件进行设置
@Override
protected void onPreExecute() {
txt1.setText("开始执行异步线程~");
}

//在doBackground方法中,每次调用publishProgress方法都会触发该方法
//运行在UI线程中,可对UI控件进行操作
@Override
protected void onProgressUpdate(Integer... values) {
int value = values[0];
progressBar2.setProgress(value);
}
}

TestActivity.java

package com.example.learning.AsyncTask;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.example.learning.R;

public class TestActivity extends AppCompatActivity {

// 声明组件
private TextView title;
private ProgressBar progressBar2;
private Button bt_start;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);

// 获取组件
title = findViewById(R.id.title);
progressBar2 = findViewById(R.id.progressBar2);
bt_start = findViewById(R.id.bt_start);

// 按钮点击事件
bt_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyAsyncTask myAsyncTask = new MyAsyncTask(title,progressBar2);
myAsyncTask.execute(1000);
}
});
}
}

【Android 练习】AsyncTask异步_ide_03