我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1. 泛型

AysncTask<Params, Progress, Result>

Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入。

Progress:后台任务执行的进度,若不用显示进度条,则不需要指定。

Result:后台任务结束时返回的结果。

2. 重要方法

doInBackground(Params... params):必须重写的方法,后台任务就在这里执行,会开启一个新的线程。params为启动任务时传入的参数,参数个数不定。

onPreExecute():在主线程中调用,在后台任务开启前的操作在这里进行,例如显示一个进度条对话框。

onPostExecute(Result result):当后台任务结束后,在主线程中调用,处理doInBackground()方法返回的结果。

onProgressUpdate(Progress... values):当在doInBackground()中调用publishProgress(Progress... values)时,返回主线程中调用,这里的参数个数也是不定的。

onCancelled():取消任务。

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能

3. 注意事项

(1)execute()方法必须在主线程中调用;

(2)AsyncTask实例必须在主线程中创建;

(3)不要手动调用doInBackground()、onPreExecute()、onPostExecute()、onProgressUpdate()方法;

(4)注意防止内存泄漏,在doInBackground()方法中若出现对Activity的强引用,可能会造成内存泄漏。

4. 下载文件动态更新进度条(未封装)

布局:

<?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:layout_height="match_parent"  android:orientation="vertical"  android:padding="20dp"  tools:context="com.studying.asynctaskdemo.MainActivity">  <ProgressBar    android:id="@+id/progressBar"        android:layout_width="match_parent"    android:layout_height="wrap_content"    android:progress="0" />  <Button    android:id="@+id/download"    android:layout_width="match_parent"    android:layout_height="50dp"    android:layout_marginTop="20dp"    android:text="@string/start_btn" />  <TextView    android:id="@+id/status"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginTop="20dp"    android:text="@string/waiting" /></LinearLayout>

Activity:

public class MainActivity extends Activity {  private static final String FILE_NAME = "test.pdf";//下载文件的名称  private static final String PDF_URL = "http://clfile.imooc.com/class/assist/118/1328281/AsyncTask.pdf";  private ProgressBar mProgressBar;  private Button mDownloadBtn;  private TextView mStatus;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    setListener();  }  private void initView() {    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);    mDownloadBtn = (Button) findViewById(R.id.download);    mStatus = (TextView) findViewById(R.id.status);  }  private void setListener() {    mDownloadBtn.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        //AsyncTask实例必须在主线程创建        DownloadAsyncTask asyncTask = new DownloadAsyncTask();        asyncTask.execute(PDF_URL);      }    });  }    private class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {    private String mFilePath;//下载文件的保存路径    @Override    protected Boolean doInBackground(String... params) {      if (params != null && params.length > 0) {        String pdfUrl = params[0];        try {          URL url = new URL(pdfUrl);          URLConnection urlConnection = url.openConnection();          InputStream in = urlConnection.getInputStream();          int contentLength = urlConnection.getContentLength();//获取内容总长度          mFilePath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME;          //若存在同名文件则删除          File pdfFile = new File(mFilePath);          if (pdfFile.exists()) {            boolean result = pdfFile.delete();            if (!result) {              return false;            }          }          int downloadSize = 0;//已经下载的大小          byte[] bytes = new byte[1024];          int length = 0;          OutputStream out = new FileOutputStream(mFilePath);          while ((length = in.read(bytes)) != -1) {            out.write(bytes, 0, length);            downloadSize += length;            publishProgress(downloadSize / contentLength * 100);          }          in.close();          out.close();        } catch (IOException e) {          e.printStackTrace();          return false;        }      } else {        return false;      }      return true;    }    @Override    protected void onPreExecute() {      super.onPreExecute();      mDownloadBtn.setText("下载中");      mDownloadBtn.setEnabled(false);      mStatus.setText("下载中");      mProgressBar.setProgress(0);    }    @Override    protected void onPostExecute(Boolean aBoolean) {      super.onPostExecute(aBoolean);      mDownloadBtn.setText("下载完成");      mStatus.setText(aBoolean ? "下载完成" + mFilePath : "下载失败");    }    @Override    protected void onProgressUpdate(Integer... values) {      super.onProgressUpdate(values);      if (values != null && values.length > 0) {        mProgressBar.setProgress(values[0]);      }    }  }}

5. 下载文件动态更新进度条(封装)

Activity:

public class MainActivity extends Activity {  private static final String FILE_NAME = "test.pdf";  private static final String PDF_URL = "http://clfile.imooc.com/class/assist/118/1328281/AsyncTask.pdf";  private ProgressBar mProgressBar;  private Button mDownloadBtn;  private TextView mStatus;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();    setListener();  }  private void initView() {    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);    mDownloadBtn = (Button) findViewById(R.id.download);    mStatus = (TextView) findViewById(R.id.status);  }  private void setListener() {    mDownloadBtn.setOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        String localPath = Environment.getExternalStorageDirectory() + File.separator + FILE_NAME;        DownloadHelper.download(PDF_URL, localPath, new DownloadHelper.OnDownloadListener() {          @Override          public void onStart() {            mDownloadBtn.setText("下载中");            mDownloadBtn.setEnabled(false);            mStatus.setText("下载中");            mProgressBar.setProgress(0);          }          @Override          public void onSuccess(File file) {            mDownloadBtn.setText("下载完成");            mStatus.setText(String.format("下载完成:%s", file.getPath()));          }          @Override          public void onFail(File file, String failInfo) {            mDownloadBtn.setText("开始下载");            mDownloadBtn.setEnabled(true);            mStatus.setText(String.format("下载失败:%s", failInfo));          }          @Override          public void onProgress(int progress) {            mProgressBar.setProgress(progress);          }        });      }    });  }}

DownloadHelper:

class DownloadHelper {  static void download(String url, String localPath, OnDownloadListener listener) {    DownloadAsyncTask task = new DownloadAsyncTask(url, localPath, listener);    task.execute();  }  private static class DownloadAsyncTask extends AsyncTask<String, Integer, Boolean> {    private String mFailInfo;    private String mUrl;    private String mFilePath;    private OnDownloadListener mListener;    DownloadAsyncTask(String mUrl, String mFilePath, OnDownloadListener mListener) {      this.mUrl = mUrl;      this.mFilePath = mFilePath;      this.mListener = mListener;    }    @Override    protected Boolean doInBackground(String... params) {        String pdfUrl = mUrl;        try {          URL url = new URL(pdfUrl);          URLConnection urlConnection = url.openConnection();          InputStream in = urlConnection.getInputStream();          int contentLength = urlConnection.getContentLength();          File pdfFile = new File(mFilePath);          if (pdfFile.exists()) {            boolean result = pdfFile.delete();            if (!result) {              mFailInfo = "存储路径下的同名文件删除失败!";              return false;            }          }          int downloadSize = 0;          byte[] bytes = new byte[1024];          int length;          OutputStream out = new FileOutputStream(mFilePath);          while ((length = in.read(bytes)) != -1) {            out.write(bytes, 0, length);            downloadSize += length;            publishProgress(downloadSize / contentLength * 100);          }          in.close();          out.close();        } catch (IOException e) {          e.printStackTrace();          mFailInfo = e.getMessage();          return false;        }      return true;    }    @Override    protected void onPreExecute() {      super.onPreExecute();      if (mListener != null) {        mListener.onStart();      }    }    @Override    protected void onPostExecute(Boolean aBoolean) {      super.onPostExecute(aBoolean);      if (mListener != null) {        if (aBoolean) {          mListener.onSuccess(new File(mFilePath));        } else {          mListener.onFail(new File(mFilePath), mFailInfo);        }      }    }    @Override    protected void onProgressUpdate(Integer... values) {      super.onProgressUpdate(values);      if (values != null && values.length > 0) {        if (mListener != null) {          mListener.onProgress(values[0]);        }      }    }  }  interface OnDownloadListener{    void onStart();    void onSuccess(File file);    void onFail(File file, String failInfo);    void onProgress(int progress);  }}

看完上述内容,你们掌握Android中怎么利用AsyncTask实现下载文件动态更新进度条功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能

Android中怎么利用AsyncTask实现下载文件动态更新进度条功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 泛型AysncTask
2023-05-30

Android中使用AsyncTask实现文件下载以及进度更新提示

Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handter即可实现。AsyncTas
2022-06-06

Handler实现线程之间的通信下载文件动态更新进度条

1. 原理每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息。2. Message初始化:一般使用Messag
2023-05-30

在Android应用中利用异步任务实现一个进度条下载功能

在Android应用中利用异步任务实现一个进度条下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。为什么要用异步任务?在Android中只有在主线程才能对u
2023-05-31

怎么在Android中利用DownloadManager实现一个文件下载功能

本篇文章为大家展示了怎么在Android中利用DownloadManager实现一个文件下载功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android中DownloadManager实现文件下
2023-05-31

怎么在Android应用中实现一个程序更新下载功能

这期内容当中小编将会给大家带来有关怎么在Android应用中实现一个程序更新下载功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。创建一个新类,名为UpdateManager,代码如下:import ja
2023-05-31

怎么在HTML5中Blob利用实现一个文件下载功能

怎么在HTML5中Blob利用实现一个文件下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。$("#exportAll").on("click",funct
2023-06-09

Flutter中怎么利用listview实现下拉刷新上拉加载更多功能

这期内容当中小编将会给大家带来有关Flutter中怎么利用listview实现下拉刷新上拉加载更多功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下拉刷新在Flutter中系统已经为我们提供了googl
2023-06-20

怎么在JAVA中利用HttpURLConnection实现一个文件上传下载功能

怎么在JAVA中利用HttpURLConnection实现一个文件上传下载功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。HttpURLConnection文
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录