AsyncTask下载网络图片并显示下载进度
1.AsyncTask概述
AsyncTask是一个轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI,AsyncTask封装了Thread和Handler,AsyncTask并不适合做特别耗时的任务。
AsyncTask是一个抽象的泛型类,提供了Params、Progress、Resault三个参数。Params表示参数类型,Progress表示后台任务执行进度的类型,Resault表示后台任务的返回结果类型,如果不需要参数也可以用Void来代替
AsyncTask提供了四个核心方法
(1)onPreExecute()
在主线程中执行,异步任务执行之前会调用,一般用于做一些准备工作
(2)doInBackground(Params…params)
在线程池中执行,用于执行异步任务
(3)onProgressUpdate(Progress… values)
在主线程中执行,当后台任务的执行进度发生改变时会调用这个方法
(4)onPostExecute(Resault resault)
异步任务执行之后,会调用该方法,此方法会返回后台任务的返回值,即doInBackground的返回值
2.AsyncTask下载网络图片并显示下载进度的实例
注意:要在清单文件中加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
直接上代码:
MainActivity.java
package com.zhoujian.thread;import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import butterknife.ButterKnife;
import butterknife.InjectView;public class MainActivity extends Activity
{@InjectView(R.id.download)Button mDownload;@InjectView(R.id.img)ImageView mImg;private MyDownLoadAsynctask mAsynctask;private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.inject(this);clickEvent();progressDialog = new ProgressDialog(this);progressDialog.setTitle("提示信息");progressDialog.setMessage("正在下载,请稍后...");progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setCanceledOnTouchOutside(false);}private void clickEvent(){mDownload.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mAsynctask = new MyDownLoadAsynctask();mAsynctask.execute("http://img04.muzhiwan.com/2015/06/16/upload_557fd293326f5.jpg");}});}class MyDownLoadAsynctask extends AsyncTask<String, Integer, Bitmap>{/*** 在主线程中执行,异步任务执行之前会调用,一般用于做一些准备工作*/@Overrideprotected void onPreExecute(){Toast.makeText(MainActivity.this, "异步任务开始执行下载", Toast.LENGTH_SHORT).show();progressDialog.show();}/*** 在线程池中执行,用于执行异步任务* @param strings* @return*/@Overrideprotected Bitmap doInBackground(String... strings) {HttpURLConnection connection = null;try {URL url = new URL(strings[0]);connection = (HttpURLConnection) url.openConnection();connection.setDoInput(true);connection.setConnectTimeout(5000);int code = connection.getResponseCode();if (code == 200) {InputStream is = connection.getInputStream();ByteArrayOutputStream bos = new ByteArrayOutputStream();int length = -1;int progress = 0;int count = connection.getContentLength();byte[] bytes = new byte[1024];while ((length = is.read(bytes)) != -1) {progress += length;if (count == 0) {publishProgress(-1);} else {//进度值改变通知,会调用onProgressUpdate()方法publishProgress((int) ((float) progress / count * 100));}if (isCancelled()) {return null;}Thread.sleep(50);bos.write(bytes, 0, length);}return BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size());}} catch (Exception e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();}}return null;}/*** 异步任务执行之后,会调用该方法,此方法会返回后台任务的返回值,即doInBackground的返回值* @param bitmap*/@Overrideprotected void onPostExecute(Bitmap bitmap){Toast.makeText(MainActivity.this, "图片下载完成", Toast.LENGTH_SHORT).show();mImg.setImageBitmap(bitmap);progressDialog.dismiss();}/*** 在主线程中执行,当后台任务的执行进度发生改变时会调用这个方法* @param values*/@Overrideprotected void onProgressUpdate(Integer... values){int progress = values[0];if (progress != -1) {progressDialog.setProgress(progress);}}}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Button
android:id="@+id/download"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="图片下载"android:textAllCaps="false"/><ImageView
android:id="@+id/img"android:layout_width="match_parent"android:layout_height="200dp"android:layout_gravity="center"android:layout_marginTop="40dp"android:scaleType="centerCrop"/>
</LinearLayout>
3.运行结果截图
AsyncTask下载网络图片并显示下载进度相关推荐
- python实现http下载文件-Python HTTP下载文件并显示下载进度条功能的实现
下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: im ...
- Unity 最新UnityWebRequest下载,同时显示下载进度,和 显示网速,今天贴出来和大家分享
Unity 最新UnityWebRequest下载网络资源,支持断点续传.多文件同时下载,同时显示下载进度,和 显示网速,今天贴出来和大家分享 显示网速图片 附上案例链接 可下载 https://do ...
- add to home screen、Google play下载应用launcher显示下载进度图标
这两种图标的添加都会走AddWorkspaceItemsTask.java,打断点就可以跟踪流程的发起和图标更新. 联系人中点击菜单可以添加快捷方式到桌面 Google play下载应用桌面显示下载进 ...
- 【踩坑】Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题
[踩坑]Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题 一. 问题重现 二. 问题解决思路 1. 确认是不是上传就导致数据出错了 2. 是不是平台问题 三. ...
- android后台文件下载库,android中如何下载文件并显示下载进度
最近开发中遇到需要下载文件的问题,对于一般的下载来说不用考虑断点续传,不用考虑多个线程,比如下载一个apk之类的,这篇文章讨论的就是这种情形. 这里主要讨论三种方式:AsyncTask.Service ...
- Android开发-下载网络图片并显示到本地
Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...
- Android中如何下载文件并显示下载进度
原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ...
- Python实现下载图片并显示下载进度
from urllib.request import urlretrieve#这是在百度图片里找到一张图片的地址 url='https://timgsa.baidu.com/timg?image&am ...
- 通过B站搜索页将搜索到的内容批量下载,并且显示下载进度
此次练习的目的 将B站的视频批量下载下来,格式为flv格式 .m4s格式的URL拼接有困难,只能一个一个进行下载,保存下来的格式为mp4 .m4s格式的连接是一个为视频连接,一个为音频连接,需要下载后 ...
最新文章
- OpenJDK官方正式宣布AWT、2D、Swing等项目解散
- Nginx(OpenResty)+Lua+Redis IP限流 10s内
- ubuntu18.04 出现 Command ‘ifconfig‘ not found 问题的解决办法
- java学习与总结:操作系统
- Python操作git
- 中邮消费金融签约神策数据 致力最优产品与服务模式
- Hibernate锁定模式– PESSIMISTIC_FORCE_INCREMENT锁定模式如何工作
- [unity3d]手游资源热更新策略探讨
- java class实例化对象_使用Class对象实例化Java类型参数/ generic
- AngularJS入门心得1——directive和controller如何通信
- vue 第五天 (事件监听基础)
- go 语言随机数的生成
- JAVA基础编程——数据库编程
- ArcGIS:使用镶嵌功能将地理空间数据云下载的多幅DEM合并为一幅
- 记又一次面试失败的经历
- INK1003注意事项
- 2023值得我们关注的10种软件测试趋势
- 不带头结点的单链表的创建(头插法和尾插法)
- 开源中国 码云 代码提交
- python3画直方图出现“Polygon‘ object has no property ‘normed”
热门文章
- Grass Planting 题解
- Java核心基础知识汇总
- windows android 对比度,色彩对比度饱和度基本测试
- 苹果要偷看你手机电脑上的照片了
- 12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 12-2 游戏角色 : 找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。 创建一个类, 将该角色绘制到屏幕中央, 并将该图像的背景色
- 【黑马程序员西安中心】我和传智有个梦!
- 计算机为什么能做翻译,为什么计算机能翻译?
- 用递归方法将十进制转化为二进制数
- [转]计算机程序设计的史诗TAOCP
- 用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则