老师快来帮我瞄瞄!下载进度条显示有问题,快3/4的时候进度条就不见了。

老师快来帮我瞄瞄!下载进度条显示有问题,快3/4的时候进度条就不见了。

下载进度条显示有问题,麻烦老师再帮我看一下其他代码有没有存在问题,或者有什么地方没处理好。

http://img1.sycdn.imooc.com//climg/5d71d9d2000152a703600163.jpghttp://img1.sycdn.imooc.com//climg/5d71d9e30001ae5103900182.jpg

几秒后

http://img1.sycdn.imooc.com//climg/5d71d9fa000102c703520159.jpg

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

登陆购买课程后可参与讨论,去登陆

4回答
提问者 雎山月 2019-09-08 12:25:02
  • 嗯,是的,就是拿当前下载的与总大小的比例。
    2019-09-09 09:50:33
好帮手慕雪 2019-09-08 11:55:43

1)android:max来设置最大值。这里只是用来做模拟网上下载资源UI的。实际工作中,是先拿到你的总大小,然后,每次更新UI时,根据你当前下载完的比例设置值的。2)练习没有固定的代码形式,跟做数学题是不一样的,只要实现效果即可。祝:学习愉快

irista23 2019-09-06 18:22:35

这里多了一个+1,和循环变量的++操作冲突了,另外可以把+1放到onProgressUpdate()方法中操作。downloadSize用这种累加处理大小可能会超过contentLength,会导致异常,你也可以跟踪下代码,看有没有异常处理导致显示不正确,另外下载一般如果是多个文件分开显示进度,这样业务更合理。

http://img1.sycdn.imooc.com//climg/5d7232b3000153c207250212.jpg

  • 提问者 雎山月 #1
    老师,那像视频中那样进度条的最大值是怎么确定的?如何保证下载完第三个文件进度条就走到100%,另外有没有源码参考学习?
    2019-09-06 20:39:00
  • 提问者 雎山月 #2
    老师,我用debug调试过了,文件的总大小和累加的大小一样,我的想法跟您说的一样,先获取文件的总大小,根据当前下载的文件大小和总文件大小的比例更新ui,但是进度条还是走到老地方就消失了。
    2019-09-08 12:24:42
  • 提问者 雎山月 #3
    老师,图我附在上面了。
    2019-09-08 12:25:35
提问者 雎山月 2019-09-06 12:07:36

还有我在

点击事件那里加一个

case R.id.stopButton:
    mTextView.setText("已暂停!");
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    break;

ui没有更新

  • 你是让UI主线程休眠了。。
    2019-09-06 18:26:13
  • 提问者 雎山月 回复 irista23 #2
    老师,我在另一个回答里看到了(使用Thread.sleep()模拟暂停操作)但此使用方法暂停后,如何更新ui?有没有别的更好的方法?
    2019-09-06 20:34:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

2.Android 网络操作与流行框架
  • 参与学习           人
  • 提交作业       220    份
  • 解答问题       1800    个

本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师