Android使用AsyncTask 有如下好处:
1. 线程的开销较大,如果每个任务都要创建一个线程,那么应用程序的效率要低很多;
2. 线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负;
3. 另外,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿;
为了解决这一问题,Android在1.5版本引入了AsyncTask. AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。
AsyncTask定义了三种泛型类型 Params,Progress和Result.
  • Params启动任务执行的输入参数,比如HTTP请求的URL;
  • Progress后台任务执行的百分比;
  • Result后台执行任务最终返回的结果,比如String;
子类必须实现抽象方法doInBackground(Params… p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用,运行过程,
onPreExecute()当任务执行之前开始调用此方法,可以在这里显示进度对话框。
doInBackground(Params…)此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onProgressUpdate(Progress…)此方法在主线程执行,用于显示任务执行的进度。
onPostExecute(Result)此方法在主线程执行,任务执行的结果作为此方法的参数返回。
class GetImageTask extends AsyncTask<String, Void, Bitmap>{
InputStream is = null; @Override
protected Bitmap doInBackground(String... params) {
// TODO Auto-generated method stub
URL myFileUrl = null;
Bitmap bitmap = null;
InputStream is = null;
HttpURLConnection conn = null;
try {
myFileUrl = new URL(params[0]);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
conn = (HttpURLConnection)myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
is =conn.getInputStream();
bitmap =BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(is != null){
is.close();
}
if( conn != null){
conn.disconnect();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return bitmap;
} @Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
} @Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
mImageAndTextView.setImage(result);
mImageAndTextView.postInvalidate(0, 0 , mScreenWidth ,mImageHeight + 30); //只更新稍比图片大一些的区域
super.onPostExecute(result);
} }

转载:http://android.662p.com/thread-240-1-1.html

用AsyncTask 来实现下载图片在android开发中的更多相关文章

  1. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  2. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  3. 在Android开发中替换资源图片不起作用的解决方法

    现象 在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,但在模拟器或者真实机器上运行时发现该图片并没有被替换,还是 ...

  4. android开发中图片优化步骤

    android开发中图片优化方法 1.图片加载方法,方便用户加载图片 /*** * 加载本地图片 * @param context:主运行函数实例 * @param bitAdress:图片地址,一般 ...

  5. 关于Android开发中的证书和密钥等问题

    关于Android开发中的证书和密钥等问题 引言 除了Android发布应用签名时需要用到证书外,在进行google Map Api开发和Facebook SDK API开发等时都需要申请API Ke ...

  6. Android 开发中三种多线程

    在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...

  7. Android 开发中,as或者idea对gradle的使用

    原文:Android 开发中,as或者idea对gradle的使用 本文属于转载收藏,侵删,出处:私人博客 ---------------------------------------------- ...

  8. Android开发中,那些让您觉得相见恨晚的方法、类或接口

    Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...

  9. android开发中系统自带语音模块的使用

    android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很 ...

随机推荐

  1. Java多线程之线程结束清理

    该事例说明了清理工作必须要放在finally块中 package Thread.Interrupting; import java.util.concurrent.TimeUnit; class Ne ...

  2. Vim 中截取部分内容保存到其他文件

    最近无聊,突然想跟着玩玩天池数据挖掘,发现数据好大,想转换到mysql数据库,phpmyadmin import 导入时抱错! 数据文件大大! 于是乎,准备截取一小段到另外一个文件测试先,然后,发现了 ...

  3. web性能测试的新利器 - Gatling 介绍

    转载:http://www.51testing.com/html/10/26810-852956.html 最近发现了一个新的性能测试工具Gatling,貌似比Jmeter还好玩.这几天就先简单介绍一 ...

  4. eclipse项目!*图标含义

    一 .项目前面有红色!,表示工程中classpath中指向的包路径错误 解决办法: 右键项目名称 BuildPath ---> Configure Build Paht...中,然后上面有几个选 ...

  5. Visual Studio 2015正式版/产品密钥 Win10正式版官方原版ISO镜像下载大全&安装激活教程

    Visual Studio 2015  发行说明: https://visualstudio.com/zh-cn/news/vs2015-vs.aspx Visual Studio  2015 特性简 ...

  6. python datetime时区转换

    from pytz import timezone def datetime_as_timezone(date_time, time_zone): tz = timezone(time_zone) u ...

  7. Mysql 学习笔记 20140219

    1. Mysql常用命令:每个命令以分号结束. create database name;          创建数据库 use databasename;              选择数据库 dr ...

  8. WPF异步调用

    this.Dispatcher.BeginInvoke(new Action(()=> this.textBlock1.Text = DateTime.Now.ToString("HH ...

  9. PinYinCls

    using System;using System.Data;using System.Configuration;using System.Linq;using System.Web;using S ...

  10. (转)Java DES 与Base64

    原文地址http://blog.csdn.net/tomatozq/article/details/20773559 1,DES /** * 解密 * @param message * @param ...