使用AsyncTask实现图片加载


如上图所示:我们看到的就是使用PrograssDialog进度条和AsyncTask异步任务实现的效果(额,不要看应用名。。。)。下面介绍一下具体的实现流程。
一、首先使用XML布局,布局很简单直接上代码:
<RelativeLayout 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"
tools:context="com.weifengzz.httpclientdemo.MainActivity$PlaceholderFragment" > <Button
android:id="@+id/getImage_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/img"
android:layout_marginTop="22dp"
android:text="获取图片" /> <ImageView
android:id="@+id/img"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:scaleType="fitCenter"
android:src="@drawable/ic_launcher" /> </RelativeLayout>
二、MainActivity类主要就是对组件的初始化。
public class MainActivity extends Activity {
private Button button = null;// 按钮
private ImageView imageView = null;// 图片
private ProgressDialog progressDialog = null;// 进度条
private String imgPath = "http://images.ent.xunlei.com/660x1500/189/120818zknfkvg2vtpupxyjdruovsafnj7mbmikn5yh7mpe.jpg";// 图片的地址
private DownLoadImage downLoadImage = null;// AsyncTask异步任务类
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intView();
//点击加载图片
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
downLoadImage.execute(imgPath);
}
});
}
/**
* 初始化组件
* */
private void intView() {
button = (Button) findViewById(R.id.getImage_btn);
imageView = (ImageView) findViewById(R.id.img);
progressDialog = new ProgressDialog(MainActivity.this);
downLoadImage = new DownLoadImage(imageView, progressDialog);
}
}
三、DownLoadImage类的实现,此类继承了 AsyncTask异步任务类
public class DownLoadImage extends AsyncTask<String, Integer, byte[]> {
private ProgressDialog progressDialog = null;//进度条
private ImageView iv = null; //图片控件
public DownLoadImage(ImageView imageView,ProgressDialog progressDialog) {
this.progressDialog = progressDialog;
this.iv = imageView;
}
/**
* 首次调用的方法,通常我们在此方法中可以初始化一些组件
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progressDialog.setTitle("下载");//设置标题
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置样式
progressDialog.setMessage("正在加载,请稍后...");//设置显示的文字
progressDialog.show();
}
/**
* 执行耗时的操作,请求网络数据 String... params:可变的数组
*/
@Override
protected byte[] doInBackground(String... params) {
// TODO Auto-generated method stub
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int temp = 0;
//使用HttpClient获取数据
HttpClient httpClient = new DefaultHttpClient();
HttpGet hg = new HttpGet(params[0]);
try {
HttpResponse httpResponse = httpClient.execute(hg);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
InputStream inputStream = httpResponse.getEntity().getContent();
long length = httpResponse.getEntity().getContentLength();
int current = 0;
//每次读10个字节,如果读的字节数据比较多的话,进度条会显示的不是那么流畅,会有很大的跳跃感
byte[] bt = new byte[10];
//循环读取数据
while ((temp = inputStream.read(bt)) != -1) {
//如果没有取消就每循环一次更新一次进度条
if (!this.isCancelled()) {
current += temp;
publishProgress((int) ((current / (float) length) * 100));
//输出流
outputStream.write(bt, 0, temp);
}
}
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return outputStream.toByteArray();
}
/**
* 调用完publishProgress之后会执行此方法,更新刻度
*/
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
/**
* 运行在UI线程中 执行完doInbackgroud方法之后,系统会调用此方法, 并且把doInbackground方法返回的结果传给此方法
*/
@Override
protected void onPostExecute(byte[] result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// 把byte数组转成Bitmap位图对象
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
iv.setImageBitmap(bitmap);
// 关闭对话框
progressDialog.dismiss();
}
}
四、最后不要忘记添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
使用AsyncTask实现图片加载的更多相关文章
- [原]Android官方图片加载利器BitmapFun解析
通过BitmapFun在项目中使用,结合代码了解一下BitmapFun加载图片的原理,以及最佳使用实践.本文说明不包括BitmapFun的缓存部分. Android开发在使用ListView和Grid ...
- Android项目框架之图片加载框架的选择
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 从Android爆发以后,自定义的控件如EditTextWithDelete.ActionBar.P ...
- Android批量图片加载经典系列——采用二级缓存、异步加载网络图片
一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络. ...
- Android中常见的图片加载框架
图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...
- 强大的图片加载框架Fresco的使用
前面在卓新科技有限公司实习的时候,在自己的爱吖头条APP中,在图片异步加载的时候和ListView的滑动中,总会出现卡顿,这是因为图片的缓存做的不是足够到位,在项目监理的帮助下,有使用Xutils框架 ...
- Android之图片加载框架Fresco基本使用(二)
PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...
- Fresco从配置到使用(最高效的图片加载框架)
Frescoj说明: facebook开源的针对android应用的图片加载框架,高效和功能齐全. 支持加载网络,本地存储和资源图片: 提供三级缓存(二级memory和一级internal ...
- iOS 正确选择图片加载方式
正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种: //方法1 UIImage *imag1 = [UIImage imageNamed:@"image.png ...
随机推荐
- IoC容器Autofac正篇之类型注册(四)
Autofac类型注册 类型注册简单的从字面去理解就可以了,不必复杂化,只是注册的手段比较丰富. (一)类型/泛型注册 builder.RegisterType<Class1>(); 这种 ...
- table-cell完成左侧定宽,右侧定宽及左右定宽等布局
使用table-cell完成以下几种布局(ie8及以上兼容) 1.左侧定宽-右侧自适应 .left{ width: 300px; height: 500px; border: 1px solid; f ...
- 基于avalon1.4.x ----分页组件编写
avalon分页组件 (1.4.x版本) 随着avalon2的推出,avalon1的官网已经不再维护了,现在似乎是找不到avalon 1.4版本的官方文档了,所以本文章所有的内容均不保证正确性,只能保 ...
- Memcached内存管理模型分析
Memcached 是一个高性能的分布式内存对象缓存系统,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而减轻RDBMS的负担,提高服务的速度.提升可扩展性.本文将基于memcached1.4 ...
- linux中运行python
1.在终端中输入: python **.py 2.最爽的方法: emacs中配置python运行环境.
- JS创建类和对象(好多方法哟!)
http://www.cnblogs.com/tiwlin/archive/2009/08/06/1540161.html 这是别人写的~~~我借来看看 JavaScript 创建类/对象的几种方式 ...
- Mysql MEMORY 引擎
CREATE TABLE `m` ( `) unsigned NOT NULL AUTO_INCREMENT, `name` ) NOT NULL, `ctime` ) NOT NULL, `ltim ...
- information_schema.engines学习
当前mysql实例的存储引擎信息可以从information_schema.engines 中查询到 例子: mysql> select * from information_schema.en ...
- FreeBSD 安装axel提高ports的安装速度
######################## FreeBSD安装Ports ######################## 1 # ee /etc/portsnap.conf 设置SERVER ...
- 英文Ubuntu下Emacs 使用 ibus 五笔
Ubuntu 12.04 Precise 英文版本 1. 安装ibus/安装ibus-table-wubi http://wiki.ubuntu.org.cn/IBus 其中im-switch命令要在 ...