只能下载一次,再次点击就无法重新载,有什么办法吗?

只能下载一次,再次点击就无法重新载,有什么办法吗?

package com.example.asynctask;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class AsncDownloadHomework extends AppCompatActivity{
   public static final int INIT_PROGRESS = 0;
   Button bt_start, bt_pause;
   TextView tv;
   ProgressBar progressB;
   int code;
   public static final int NOT_START_TASK=0;
   public static final int START_TASK=1;
   public static final int PAUSE_TASK=-1;
   public static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";


   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.downloadhomework);
       initView();
       initData();
       //新建异步下载任务
      final DownloadAsyncTask downloadAsyncTask = new DownloadAsyncTask(PAUSE_TASK);
       downloadAsyncTask.execute(APK_URL, APK_URL, APK_URL);//第一次开始下载
       //开始下载按钮监听器
       bt_start.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               code=START_TASK;
               downloadAsyncTask.setDownloadCode(code);//设置开始下载参数
               bt_pause.setEnabled(true);
           }
       });
       //暂停下载按钮监听器
       bt_pause.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               code=PAUSE_TASK;
               downloadAsyncTask.setDownloadCode(code);

           }
       });
   } private void initData() {
       code=NOT_START_TASK;
       progressB.setMax(100);
       progressB.setProgress(0);
       bt_pause.setEnabled(false);//暂停按钮设为“不可点击”


   }

   private void initView() {
       bt_start = findViewById(R.id.bt_start);
       bt_pause = findViewById(R.id.bt_pause);
       tv = findViewById(R.id.tv_showProgressBar);
       progressB = findViewById(R.id.progressb);
   }



   /**
    * String 入参
    * Integer 进度
    * Boolean 返回值
    */
   public  class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {
       String mFilePath;
       int contentLength;
       int downloadSize;
       int downloadCode;
       int i=0;

       public int getDownloadCode() {
           return downloadCode;
       }

       public void setDownloadCode(int downloadCode) {
           this.downloadCode = downloadCode;
       }

       public DownloadAsyncTask(int downloadCode) {
           this.setDownloadCode(downloadCode);
   }

       /**
        * 在异步任务之前,在主线程中
        */
       @Override
       protected void onPreExecute() {
           super.onPreExecute();
           // 可操作UI  类似淘米,之前的准备工作
           bt_start.setText(R.string.bt_start_a_task);
           bt_pause.setText(R.string.bt_pause_task);
           bt_pause.setEnabled(false);
           progressB.setProgress(INIT_PROGRESS);
       }

       /**
        * 在另外一个线程中处理事件
        *
        * @param params 入参  煮米
        * @return 结果
        */
       @Override
       protected Boolean doInBackground(String... params) {
           while(downloadCode==PAUSE_TASK)//暂停下载
           {
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
                   return  false;
               }
           }
           if (params != null && params.length > 0) {
               for( i=0;i<params.length;i++){
                   while(downloadCode==PAUSE_TASK)//暂停下载
                   {
                       try {
                           Thread.sleep(1000);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                           return  false;
                       }
                   }
               String apkUrl = params[i];
                contentLength=params.length;
                   // 下载地址准备
                   mFilePath = Environment.getExternalStorageDirectory()
                           + File.separator + "imooc"+Integer.toString(i)+".apk";
               try {
                   // 构造URL
                   URL url = new URL(apkUrl);
                   // 构造连接,并打开
                   URLConnection urlConnection = url.openConnection();
                   InputStream inputStream = urlConnection.getInputStream();

                   // 获取了下载内容的总长度
                  // contentLength = urlConnection.getContentLength();

                   // 对下载地址进行处理
                   File apkFile = new File(mFilePath);
                   if (apkFile.exists()) {
                       boolean result = apkFile.delete();
                       if (!result) {
                           return false;
                       }
                   }

                   // 已下载的大小
                   downloadSize = 0;

                   // byte数组
                   byte[] bytes = new byte[1024];

                   int length;

                   // 创建一个输入管道
                   OutputStream outputStream = new FileOutputStream(mFilePath);

                   // 不断的一车一车挖土,走到挖不到为止
                   while ((length = inputStream.read(bytes)) != -1) {
                       // 挖到的放到我们的文件管道里
                       outputStream.write(bytes, 0, length);
                       // 累加我们的大小
                       downloadSize += length;
                       // 发送进度
                       publishProgress((i+1)*100 / params.length);
                       try {
                           Thread.sleep(500);//延时下载速度,方便清楚观察进度
                       } catch (InterruptedException e) {
                           e.printStackTrace();return false;
                       }
                   }

                   inputStream.close();
                   outputStream.close();
               } catch (IOException e) {
                   e.printStackTrace();
                   return false;
               }
           }} else {
               return false;
           }
           return true;
       }

       @Override
       protected void onPostExecute(Boolean result) {
           super.onPostExecute(result);
           // 也是在主线程中 ,执行结果处理
           if (result) {
          code=NOT_START_TASK;     i=0; //准备下一次重新下载数据
               bt_pause.setEnabled(false);//下载完成后,暂停下载按钮不可点
               tv.setText(result ? "下载完成" + mFilePath : "下载失败");
           }
       }
       @Override
       protected void onProgressUpdate (Integer...values){
           super.onProgressUpdate(values);
           // 收到进度,然后处理: 也是在UI线程中。
          if (values != null && values.length > 0) {
              if(downloadCode==PAUSE_TASK){
                  tv.setText("已经暂停下载"+",已下载" + (i+1) + "个,下载进度" + values[0] + "%");}
                  else
                      {
                          progressB.setProgress(values[0]);
                  tv.setText("文件数" + contentLength + ",已下载" + (i + 1) + "个,下载进度" + values[0] + "%");
              }
           }
       }



   }
}

正在回答

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

2回答

参考老师课堂案例的源码,把下载任务创建和启动放到按钮事件中,暂停处理参考我下面给你的解决方案修改一下

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

irista23 2018-12-12 16:06:53

你可以在点击暂停按钮时,调用downloadAsyncTask的cancel(true)方法来设置暂停,在doInBackground()模拟循环下载中添加如下代码

if (isCancelled()) {
   break;
}


  • 提问者 慕运维0750787 #1
    暂停是已经实现了,只是只能下载一次文件。我的程序是异步下载三个文件,过程 中能暂停下载,也能点击继续下载。只是全部下载完成后无法重新开始下载。
    2018-12-12 16:49:40
  • irista23 回复 提问者 慕运维0750787 #2
    可以把execute()执行放到开始下载按钮点击事件中
    2018-12-12 17:08:31
  • 提问者 慕运维0750787 #3
    使用这个,也没法解决下载完毕后,重新开始下载的问题
    2018-12-12 17:52:49
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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