Android带进度条的下载图片示例(AsyncTask异步任务)
发布时间 - 2026-01-11 00:32:14 点击率:次为什么要用异步任务?

在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作
android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作。如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常。所以我们要使用异步任务。android为我们提供了一个封装好的组件asynctask。
AsyncTask可以在子线程中更新ui,封装简化了异步操作。适用于简单的异步处理。如果多个后台任务时就要使用Handler了 在这里就不再说明。
AsyncTask通常用于被继承。AsyncTask定义了三种泛型类型<Params,Progress,Result>
- Params:启动任务时输入的参数类型
- Progress:后台任务执行的百分比
- Result:执行任务完成后返回结果的类型
继承AsyncTask后要重写的方法有:
doInBackgroud:必须重写,异步执行后台线程要完成的任务,耗时任务要写在这里,并且在这里不能操作ui。可以调用 publishProgress方法来更新实时的任务进度
onPreExecute:执行耗时操作前调用,可以完成一些初始化操作
onPostExecute:在doInBackground 执行完成后,主线程调用此方法,可以在此方法中操作ui
onProgressUpdate:在doInBackgroud方法中调用publishProgress方法,更新任务的执行进度后 就会调用这个方法
下面通过一个实例来了解AsyncTask
首先附上运行结果
布局文件:
<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" > <Button android:id="@+id/btn_download" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="点击下载" /> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/iv_image" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitCenter" /> </FrameLayout> </LinearLayout>
MainActivity
package com.example.asynctask;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URLConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnClickListener{
private ImageView image;
private ProgressDialog progress;
private Button btn_download;
private static String URL="http://img4.imgtn.bdimg.com/it/u=1256159061,743487979&fm=21&gp=0.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image=(ImageView) findViewById(R.id.iv_image);
btn_download=(Button) findViewById(R.id.btn_download);
progress=new ProgressDialog(this);
progress.setIcon(R.drawable.ic_launcher);
progress.setTitle("提示信息");
progress.setMessage("正在下载,请稍候...");
progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
btn_download.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new MyAsyncTask().execute(URL);
}
/*
* String*********对应我们的URL类型
* Integer********进度条的进度值
* BitMap*********异步任务完成后返回的类型
* */
class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{
//执行异步任务(doInBackground)之前执行,并且在ui线程中执行
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
if(image!=null){
image.setVisibility(View.GONE);
}
//开始下载 对话框进度条显示
progress.show();
progress.setProgress(0);
}
@Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
//params是一个可变长的数组 在这里我们只传进来了一个url
String url=params[0];
Bitmap bitmap=null;
URLConnection connection;
InputStream is;//用于获取数据的输入流
ByteArrayOutputStream bos;//可以捕获内存缓冲区的数据,转换成字节数组。
int len;
float count=0,total;//count为图片已经下载的大小 total为总大小
try {
//获取网络连接对象
connection=(URLConnection) new java.net.URL(url).openConnection();
//获取当前页面的总长度
total=(int)connection.getContentLength();
//获取输入流
is=connection.getInputStream();
bos=new ByteArrayOutputStream();
byte []data=new byte[1024];
while((len=is.read(data))!=-1){
count+=len;
bos.write(data,0,len);
//调用publishProgress公布进度,最后onProgressUpdate方法将被执行
publishProgress((int)(count/total*100));
//为了显示出进度 人为休眠0.5秒
Thread.sleep(500);
}
bitmap=BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.toByteArray().length);
is.close();
bos.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
//在ui线程中执行 可以操作ui
@Override
protected void onPostExecute(Bitmap bitmap) {
// TODO Auto-generated method stub
super.onPostExecute(bitmap);
//下载完成 对话框进度条隐藏
progress.cancel();
image.setImageBitmap(bitmap);
image.setVisibility(View.VISIBLE);
}
/*
* 在doInBackground方法中已经调用publishProgress方法 更新任务的执行进度后
* 调用这个方法 实现进度条的更新
* */
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progress.setProgress(values[0]);
}
}
}
最后不要忘记在AndroidManifest文件中配置网络访问权限
<uses-permission android:name="android.permission.INTERNET"/>
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# asynctask
# 进度条
# asynctask异步任务
# 异步asynctask
# Android-AnsyncTask异步任务的使用
# Android 异步任务 设置 超时使用handler更新通知功能
# Android AsyncTack 异步任务实例详解
# Android消息机制Handler用法总结
# 详解Android 消息处理机制
# Android编程实现异步消息处理机制的几种方法总结
# Android 异步任务和消息机制面试题分析
# 在这里
# 是一个
# 放在
# 重写
# 完成后
# 对话框
# 要使
# 就会
# 多个
# 在此
# 适用于
# 提示信息
# 要用
# 三种
# 将被
# 点击下载
# 时就
# 能把
# 请稍候
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何选择PHP开源工具快速搭建网站?
如何快速搭建高效WAP手机网站?
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
如何在IIS中新建站点并配置端口与物理路径?
,交易猫的商品怎么发布到网站上去?
Laravel如何生成API文档?(Swagger/OpenAPI教程)
如何快速搭建高效香港服务器网站?
Laravel如何为API编写文档_Laravel API文档生成与维护方法
创业网站制作流程,创业网站可靠吗?
中国移动官方网站首页入口 中国移动官网网页登录
如何在建站之星网店版论坛获取技术支持?
网站制作免费,什么网站能看正片电影?
如何在服务器上三步完成建站并提升流量?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何将凡科建站内容保存为本地文件?
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Python文件操作最佳实践_稳定性说明【指导】
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何选择可靠的免备案建站服务器?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
JavaScript如何实现错误处理_try...catch如何捕获异常?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Laravel PHP版本要求一览_Laravel各版本环境要求对照
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Android仿QQ列表左滑删除操作
在Oracle关闭情况下如何修改spfile的参数
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
js实现点击每个li节点,都弹出其文本值及修改
制作旅游网站html,怎样注册旅游网站?
Laravel中的Facade(门面)到底是什么原理
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel如何使用Eloquent进行子查询
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel如何自定义错误页面(404, 500)?(代码示例)
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Android中AutoCompleteTextView自动提示
Bootstrap整体框架之JavaScript插件架构

