MainActivity
package com.example.asynctest;
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.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String APK_URL= "http://down11.zol.com.cn/liaotian/yingyongbao8.2.5w.apk";
private Button button;
private ProgressBar progressBar;
private TextView textView;
private String mPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化视图
initView();
//设置监听
setListener();
//设置UI数据
setData();
}
private void initView() {
button = findViewById(R.id.btn_start);
progressBar = findViewById(R.id.progressBar);
textView = findViewById(R.id.textv);
}
private void setListener() {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: 2022/8/25 下载任务
DownAsyncTask downAsyncTask=new DownAsyncTask();
downAsyncTask.execute(APK_URL);
}
});
}
private void setData() {
textView.setText("准备下载");
button.setText("点击下载");
progressBar.setProgress(0);
}
class DownAsyncTask extends AsyncTask<String,Integer,Boolean>{
/**
* 在异步之前,在主线程中,可操作UI
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
textView.setText("下载中");
button.setText("下载中");
progressBar.setProgress(0);
}
/**
* 在另外一个线程处理的事情
* @param strings 入参
* @return 结果
*/
@Override
protected Boolean doInBackground(String... strings) {
if(strings != null && strings.length > 0){
String apkurl = strings[0];
try {
//构造URL
URL url=new URL(apkurl);
//构造链接,并打开
URLConnection urlConnection = url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
//进度条长度
int contentLength = urlConnection.getContentLength();
//下载地址
mPath ="/data/data/com.example.asynctest"+ File.separator+"abc.apk";
//下载地址处理
File file = new File(mPath);
if(file.exists()){
boolean delete = file.delete();
if(!delete){
return false;
}
}
//已下载大小
int downloadSize=0;
byte[] bytes=new byte[1024];
int len=0;
FileOutputStream outputStream = new FileOutputStream(mPath);
while ((len = inputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
downloadSize+=len;
//发送进度
publishProgress(downloadSize*100/contentLength);
}
//释放资源
inputStream.close();
outputStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else {
return false;
}
return true;
}
/**
* 主线程中可以对执行结果处理
* @param aBoolean
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
textView.setText(aBoolean ?"下载完成"+mPath:"下载失败");
button.setText(aBoolean ?"下载完成":"下载失败");
}
//进度改变
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
//收到进度处理
Log.e("TAG", "onProgressUpdate: " );
if(values!=null && values.length>0){
progressBar.setProgress(values[0]);
}
}
//
@Override
protected void onCancelled() {
super.onCancelled();
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ProgressBar
android:max="100"
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="15dp" />
<Button
android:id="@+id/btn_start"
android:text="点击下载"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/textv"
android:text="HelloWorld"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>