热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Android中使用AsyncTask实现文件下载以及进度更新提示

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android中使用AsyncTask实现文件下载以及进度更新提示相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android中使用AsyncTask实现文件下载以及进度更新提示相关的知识,希望对你有一定的参考价值。


android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handter即可实现。AsyncTask是抽象类。AsyncTask定义了三种泛型类型Params,Progress和Result:

Params启动任务执行的输入参数,比如,HTTP请求的URL。

Progress后台任务执行的百分比。

Result后台执行任务最终返回的结果,比如String。


通过用AsyncTask实现文件下载以及进度更新提示的演示动图:

本次真机演示的下载目录为Download文件夹,首先进入Download文件夹,没有图片文件,下载完成后,再次查看,可以看到本次演示的下载图片


首先我们简单介绍AsyncTask的执行步骤:

AsyncTask的执行分为四个步骤,每一步对应一个回调方法,我们需要的就是实现这些方法。

(1)首先定义一个类继承AsyncTask

(2)实现AsyncTask中定义的下面一个或几个方法

四个步骤方法分别为:

(1)onPreExecute():被UIThread调用,该方法用来做一些准备工作,如在界面上显示一个进度条。

(2)dolnBackground(Params…):将在onPreExecute之后执行,运行在后台线程中。负责执行耗时工作。可以调用publishProgress方法来更新实时任务进度。

(3)onProgressUpdate(Progress…):在publishProgress方法被调用后,UIThread将调用该方法在界面上展示任务的进展情况,例如通过一个进度条进行展示。

(4)onPostExecute(Result):在dolnBackground执行完成后,onPostExecute方法将被UIThread调用,后台的计算结果将通过该方法传递到UIThread。


效果实现代码示例:


第一步:Layout中Activity的布局文件activity_main.xml


1
2 <LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:id="@+id/activity_main"
6 android:layout_
7 android:layout_
8 android:orientation="vertical"
9 tools:cOntext="com.example.administrator.asynctask.MainActivity">
10 <TextView
11 android:id="@+id/tv"
12 android:layout_
13 android:layout_
14 android:text="panhouye!"
15 android:textSize="20sp"/>
16 <ProgressBar
17 android:id="@+id/progress"
18 android:layout_
19 android:layout_
20
21 android:visibility="visible"/>
22 <Button
23 android:layout_
24 android:layout_
25 android:OnClick="image"
26 android:text="下载图片"/>
27


第二步:Java实现代码MainActivity.java文件


1 import android.os.AsyncTask;
2 import android.os.Environment;
3 import android.support.v7.app.AppCompatActivity;
4 import android.os.Bundle;
5 import android.view.View;
6 import android.widget.ProgressBar;
7 import android.widget.TextView;
8 import java.io.BufferedInputStream;
9 import java.io.BufferedOutputStream;
10 import java.io.File;
11 import java.io.FileOutputStream;
12 import java.net.HttpURLConnection;
13 import java.net.URL;
14 /**
15 * Created by panchengjia on 2016/12/19.
16 */
17 public class MainActivity extends AppCompatActivity {
18 //声明publishProgress的更新标记
19 private static final int PROGRESS_MAX = 0X1;
20 private static final int UPDATE = 0X2;
21 private TextView tv;
22 ProgressBar progress;
23 int contentLen;//声明要下载的文件总长
24 @Override
25 protected void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 setContentView(R.layout.activity_main);
28 tv = (TextView) findViewById(R.id.tv);
29 progress = (ProgressBar) findViewById(R.id.progress);
30 }
31 public void image(View view){
32 //启用AsyncTask,传入需要执行的内容(图片地址)
33 new DownLoad().execute("http://cdnq.duitang.com/uploads/item/201402/22/20140222115440_jWNmx.thumb.700_0.jpeg");
34 }
35 class DownLoad extends AsyncTask{
36 //在执行实际的后台操作前被UI Thread调用
37 @Override
38 protected void onPreExecute() {
39 super.onPreExecute();
40 //准备下载前的初始进度
41 progress.setProgress(0);
42 }
43 //在onPreExecute执行,该方法运行在后台线程中
44 @Override
45 protected String doInBackground(String... params) {
46 try {
47 URL url = new URL(params[0]);
48 //获取连接
49 HttpURLConnection cOnnection= (HttpURLConnection) url.openConnection();
50 //获取下载文件的大小
51 cOntentLen= connection.getContentLength();
52 //根据下载文件大小设置进度条最大值(使用标记区别实时进度更新)
53 publishProgress(PROGRESS_MAX,contentLen);
54 //循环下载(边读取边存入)
55 BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
56 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new
57 File(Environment.getExternalStorageDirectory()+"/Download/ss.jpg")));
58 int len =-1;
59 byte[] bytes = new byte[1024];
60 while((len=bis.read(bytes))!=-1){
61 bos.write(bytes,0,len);
62 bos.flush();
63 //实时更新下载进度(使用标记区别最大值)
64 publishProgress(UPDATE,len);
65 //演示下载的图片太小,网速太快,休眠300毫秒,方便大家观察
66 Thread.sleep(300);
67 }
68 bos.close();
69 bis.close();
70 } catch (Exception e) {
71 e.printStackTrace();
72 }
73 return "下载完成";
74 }
75 //在publishProgress被调用后,UI thread会调用这个方法
76 @Override
77 protected void onProgressUpdate(Integer... values) {
78 super.onProgressUpdate(values);
79 switch (values[0]){
80 case PROGRESS_MAX:
81 progress.setMax(values[1]);
82 break;
83 case UPDATE:
84 progress.incrementProgressBy(values[1]);
85 //获取下载进度百分比并更新textview
86 int i=(progress.getProgress()*100)/contentLen;
87 tv.setText("下载进度为:"+i+"%");
88 break;
89 }
90 }
91 //doInBackground方法执行完后被UI thread执行
92 @Override
93 protected void onPostExecute(String s) {
94 super.onPostExecute(s);
95 progress.setVisibility(View.GONE);
96 tv.setText(s);
97 }
98 }
99 }


第三步:AndroidMainfest.xml配置文件中添加权限

因为要使用网络下载图片以及使用手机存储下载图片,所以需要在AndroidMainfest.xml文件添加网络以及读写手机外部存储的权限:


1
2


最后强调一下AsyncTask的设计准则:

(1)AsyncTask的实例必须在UlThread中创建。

(2)execute方法必须在UlThread中调用。

(3)不要手动的调用onPreExecute(),onPostExecute(Result),dolnBackground(Params…),onProgressUpdate(Progress…)这几个方法。

(4)该Task只能被执行一次,否则多次调用时将会出现异常。

(5)AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。

 



推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
author-avatar
ai美的传说_581
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有