Android中使用AsyncTask实现文件下载以及进度更新提示
来源:互联网 发布:济南关键词优化方案 编辑:程序博客网 时间:2024/05/17 00:09
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 <?xml version="1.0" encoding="utf-8"?> 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_width="match_parent" 7 android:layout_height="match_parent" 8 android:orientation="vertical" 9 tools:context="com.example.administrator.asynctask.MainActivity">10 <TextView11 android:id="@+id/tv"12 android:layout_width="match_parent"13 android:layout_height="wrap_content"14 android:text="panhouye!"15 android:textSize="20sp"/>16 <ProgressBar17 android:id="@+id/progress"18 android:layout_width="match_parent"19 android:layout_height="wrap_content"20 style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"21 android:visibility="visible"/>22 <Button23 android:layout_width="match_parent"24 android:layout_height="wrap_content"25 android:onClick="image"26 android:text="下载图片"/>27 </LinearLayout>
第二步: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 @Override25 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<String,Integer,String>{36 //在执行实际的后台操作前被UI Thread调用37 @Override38 protected void onPreExecute {39 super.onPreExecute;40 //准备下载前的初始进度41 progress.setProgress(0);42 }43 //在onPreExecute执行,该方法运行在后台线程中44 @Override45 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(new57 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 @Override77 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 //获取下载进度百分比并更新textview86 int i=(progress.getProgress*100)/contentLen;87 tv.setText("下载进度为:"+i+"%");88 break;89 }90 }91 //doInBackground方法执行完后被UI thread执行92 @Override93 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 <uses-permission android:name="android.permission.INTERNET" />2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
最后强调一下AsyncTask的设计准则:
(1)AsyncTask的实例必须在UlThread中创建。
(2)execute方法必须在UlThread中调用。
(3)不要手动的调用onPreExecute,onPostExecute(Result),dolnBackground(Params…),onProgressUpdate(Progress…)这几个方法。
(4)该Task只能被执行一次,否则多次调用时将会出现异常。
(5)AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。
本文为头条号作者发布,不代表今日头条立场。
- Android中使用AsyncTask实现文件下载以及进度更新提示
- Android中使用AsyncTask实现文件下载以及进度更新提示
- Android中使用Notification实现应用更新显示下载进度
- 使用AsyncTask下载图片并更新进度
- 文件下载之使用AsyncTask并在进度对话框中显示下载进度
- android AsyncTask下载文件并且显示进度
- Android服务器——使用TomCat实现软件的版本检测,升级,以及下载更新进度!
- android中DownloadManager实现版本更新,监听下载进度实例
- Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度
- Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度
- Android中AsyncTask进行后台下载文件并在下拉菜单显示下载进度
- Android 文件下载,断点续传,进度更新
- 在Activity中获取AsyncTask中更新progress的值,可用在文件的上传和下载同步显示进度
- Android提示版本更新+notification显示下载进度
- android 文件断点续传下载,外加下载进度提示
- 使用AsyncTask异步任务更新进度
- Android AsyncTask异步实现大文件下载
- 使用AsyncTask实现异步文件下载
- 小程序开发资料!!!
- MYSQL数据库优化之SQL及索引优化-学习笔记(2)
- HttpClient,DefaultHttpClient使用详解
- Android源码树常用命令
- DEDECMS获取上级导航名称
- Android中使用AsyncTask实现文件下载以及进度更新提示
- Handler系列之使用
- 解决dubbo问题:forbid consumer
- vim 配置收藏
- MySQL有趣的查询方式
- DEDECMS会员空间不能分页的解决办法
- 资源 Resource
- Java多线程---生产者消费者练习题
- 九大基础排序总结与对比