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下载网络图片并显示下载进度相关推荐

  1. python实现http下载文件-Python HTTP下载文件并显示下载进度条功能的实现

    下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: im ...

  2. Unity 最新UnityWebRequest下载,同时显示下载进度,和 显示网速,今天贴出来和大家分享

    Unity 最新UnityWebRequest下载网络资源,支持断点续传.多文件同时下载,同时显示下载进度,和 显示网速,今天贴出来和大家分享 显示网速图片 附上案例链接 可下载 https://do ...

  3. add to home screen、Google play下载应用launcher显示下载进度图标

    这两种图标的添加都会走AddWorkspaceItemsTask.java,打断点就可以跟踪流程的发起和图标更新. 联系人中点击菜单可以添加快捷方式到桌面 Google play下载应用桌面显示下载进 ...

  4. 【踩坑】Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题

    [踩坑]Linux java中ftp下载文件,解压文件损坏,以及图片下载打开只显示下载路径的问题 一. 问题重现 二. 问题解决思路 1. 确认是不是上传就导致数据出错了 2. 是不是平台问题 三. ...

  5. android后台文件下载库,android中如何下载文件并显示下载进度

    最近开发中遇到需要下载文件的问题,对于一般的下载来说不用考虑断点续传,不用考虑多个线程,比如下载一个apk之类的,这篇文章讨论的就是这种情形. 这里主要讨论三种方式:AsyncTask.Service ...

  6. Android开发-下载网络图片并显示到本地

    Android下载网络图片的流程是: 发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件. 注意点 最新的Android系统不可以在主线程上请求 ...

  7. Android中如何下载文件并显示下载进度

    原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Serv ...

  8. Python实现下载图片并显示下载进度

    from urllib.request import urlretrieve#这是在百度图片里找到一张图片的地址 url='https://timgsa.baidu.com/timg?image&am ...

  9. 通过B站搜索页将搜索到的内容批量下载,并且显示下载进度

    此次练习的目的 将B站的视频批量下载下来,格式为flv格式 .m4s格式的URL拼接有困难,只能一个一个进行下载,保存下来的格式为mp4 .m4s格式的连接是一个为视频连接,一个为音频连接,需要下载后 ...

最新文章

  1. OpenJDK官方正式宣布AWT、2D、Swing等项目解散
  2. Nginx(OpenResty)+Lua+Redis IP限流 10s内
  3. ubuntu18.04 出现 Command ‘ifconfig‘ not found 问题的解决办法
  4. java学习与总结:操作系统
  5. Python操作git
  6. 中邮消费金融签约神策数据 致力最优产品与服务模式
  7. Hibernate锁定模式– PESSIMISTIC_FORCE_INCREMENT锁定模式如何工作
  8. [unity3d]手游资源热更新策略探讨
  9. java class实例化对象_使用Class对象实例化Java类型参数/ generic
  10. AngularJS入门心得1——directive和controller如何通信
  11. vue 第五天 (事件监听基础)
  12. go 语言随机数的生成
  13. JAVA基础编程——数据库编程
  14. ArcGIS:使用镶嵌功能将地理空间数据云下载的多幅DEM合并为一幅
  15. 记又一次面试失败的经历
  16. INK1003注意事项
  17. 2023值得我们关注的10种软件测试趋势
  18. 不带头结点的单链表的创建(头插法和尾插法)
  19. 开源中国 码云 代码提交
  20. python3画直方图出现“Polygon‘ object has no property ‘normed”

热门文章

  1. Grass Planting 题解
  2. Java核心基础知识汇总
  3. windows android 对比度,色彩对比度饱和度基本测试
  4. 苹果要偷看你手机电脑上的照片了
  5. 12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 12-2 游戏角色 : 找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。 创建一个类, 将该角色绘制到屏幕中央, 并将该图像的背景色
  6. 【黑马程序员西安中心】我和传智有个梦!
  7. 计算机为什么能做翻译,为什么计算机能翻译?
  8. 用递归方法将十进制转化为二进制数
  9. [转]计算机程序设计的史诗TAOCP
  10. 用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则