老师快来帮我瞄瞄!下载进度条显示有问题,快3/4的时候进度条就不见了。
下载进度条显示有问题,麻烦老师再帮我看一下其他代码有没有存在问题,或者有什么地方没处理好。


几秒后

entiy/Download.java
public class Download {
private String url;
private String filePath;
public Download(String url, String filePath) {
this.url = url;
this.filePath = filePath;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}util/DataUtil.java
import java.util.ArrayList;
import java.util.List;
public class DataUtil {
public static List<Download> getDownloadInfo(String[] urls, String [] filePaths){
List<Download> list = new ArrayList<>();
for (int index = 0; index < urls.length; index++) {
Download download = new Download(urls[index],filePaths[index]);
list.add(download);
}
return list;
}
}DownloadHelper.java
public class DownloadHelper {
private static final String TAG = "DownloadHelper";
private static DownloadAsyncTask mDownloadAsyncTask;
public static void download(List<Download> mlist, Activity activity, OnDownloadListener listener) {
mDownloadAsyncTask = new DownloadAsyncTask(mlist,activity, listener);
mDownloadAsyncTask.execute();
}
public static class DownloadAsyncTask extends AsyncTask<List<Download>, Integer, Boolean> {
private List<Download> mDownloadList;
private OnDownloadListener mListener;
//弱引用
private WeakReference<Activity> mWeakReference;
private Activity activity;
private int contentLength;
public DownloadAsyncTask(List<Download> mDownloadList, Activity activity, OnDownloadListener listener) {
this.mDownloadList = mDownloadList;
this.mListener = listener;
this.mWeakReference = new WeakReference<>(activity);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
activity = mWeakReference.get();
mListener.onStart();
}
@Override
protected Boolean doInBackground(List<Download>... lists) {
if(isCancelled()) return null;
//获取文件总长度
URLConnection[] connections = new URLConnection[mDownloadList.size()];
for (int index = 0; index < mDownloadList.size(); index++) {
try {
URL url = new URL(mDownloadList.get(index).getUrl());
//构建并打开连接
connections[index] = url.openConnection();
//获取文件总长度
contentLength += connections[index].getContentLength();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//已下载大小
int downloadSize = 0;
for (int index = 0;index<mDownloadList.size();index++) {
try {
//获取输入流
InputStream inputStream = connections[index].getInputStream();
//对下载地址进行处理
File apkFile = new File(mDownloadList.get(index).getFilePath());
if (apkFile.exists()) {
boolean result = apkFile.delete();
if (!result) {
if (mListener != null) {
mListener.onFail(-2, apkFile, "文件删除失败");
}
}
}
//byte数组
byte[] bytes = new byte[1024];
int length = 0;
//创建一个输出管道
OutputStream outputStream = new FileOutputStream(mDownloadList.get(index).getFilePath());
while ((length = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, length);
//累加大小
downloadSize += length;
publishProgress(downloadSize * 100 / contentLength,index+1);
}
} catch (MalformedURLException e) {
e.printStackTrace();
if (mListener != null) {
mListener.onFail(-2, new File(mDownloadList.get(index).getFilePath()), e.getMessage());
}
return false;
} catch (IOException e) {
e.printStackTrace();
if (mListener != null) {
mListener.onFail(-2, new File(mDownloadList.get(index).getFilePath()), e.getMessage());
}
return false;
}
if (mListener != null) {
mListener.onSuccess(0, new File(mDownloadList.get(index).getFilePath()));
}
}
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (mListener != null && values[0]!=0){
mListener.onProgress(values[0],values[1]);
}
if(isCancelled()){
return;
}
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if(mListener != null){
mListener.onPost();
}
}
@Override
protected void onCancelled() {
super.onCancelled();
DownloadAsyncTask.this.cancel(true);
}
}
public interface OnDownloadListener {
void onStart();
void onSuccess(int code, File file);
void onProgress(int progress,int number);
void onFail(int code, File file, String message);
void onPost();
}
abstract static class SimpleDownloadListener implements OnDownloadListener{
@Override
public void onStart() {
}
@Override
public void onFail(int code, File file, String message) {
}
@Override
public void onSuccess(int code, File file) {
}
}
}MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTextView;
private Button mStarButton;
private Button mStopButton;
List<Download> downloads;
private ProgressBar mProgressBar;
private String[] mApkPaths;
private String[] mUrls;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化数据
initData();
//初始化视图
initView();
//设置监听事件
setListener();
}
private void initData() {
mApkPaths = new String[]{
Environment.getExternalStorageDirectory() + File.separator + "imooc111.apk",
Environment.getExternalStorageDirectory() + File.separator + "imooc222.apk",
Environment.getExternalStorageDirectory() + File.separator + "imooc333.apk"
};
mUrls = new String[]{
"http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk",
"http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk",
"http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk"
};
downloads = DataUtil.getDownloadInfo(mUrls, mApkPaths);
}
/**
* 初始化视图
*/
private void initView() {
mTextView = findViewById(R.id.textView);
mStarButton = findViewById(R.id.startButton);
mStopButton = findViewById(R.id.stopButton);
mProgressBar = findViewById(R.id.progressBar);
}
/**
* 设置监听事件
*/
private void setListener() {
mStarButton.setOnClickListener(this);
mStopButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.startButton:
//下载
DownloadHelper.download(downloads, MainActivity.this, new DownloadHelper.SimpleDownloadListener() {
@Override
public void onProgress(int progress, int number) {
mTextView.setText("正在下载第"+number+"个文件");
mProgressBar.setProgress(progress);
}
@Override
public void onPost() {
mTextView.setText("下载完成");
}
});
break;
case R.id.stopButton:
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
正在回答 回答被采纳积分+1
- 参与学习 人
- 提交作业 220 份
- 解答问题 1800 个
本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。
了解课程


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星