Android批量图片加载经典系列——使用xutil框架缓存、异步加载网络图片
| 一、问题描述 |
为提高图片加载的效率,需要对图片的采用缓存和异步加载策略,编码相对比较复杂,实际上有一些优秀的框架提供了解决方案,比如近期在git上比较活跃的xutil框架
Xutil框架提供了四大模块:
1、 DbUtil模块:采用ORM机制简化Sqlite操作,一行代码就可执行增删改查、支持事务、支持延迟策略
2、 ViewUtils模块:可以说是Android的IOC框架,可以注解方式对ui、资源、事件进行绑定
3、 HttpUtils模块:支持同步、异步请求、支持大文件上传
4、 BitmapUtils模块:图片的异步加载,支持本地和网络图片, 图片的压缩处理, 图片的内存缓存以及本地文件缓存。
本案例主要使用Xutil的HttpUtils模块和BitmapUtils模块
| 二、案例介绍 |
实现图片新闻浏览:

| 三、案例主要技术 |
1、使用HttpUtils模块实现网络通信
(1)RequestParams组件设置请求参数、上传文件等信息
RequestParams params = new RequestParams(“utf-8”); // 默认编码UTF-8
params.addQueryStringParameter("categoryId","2");//设置参数
(2) HttpUtils组件发送请求
HttpUtils http = new HttpUtils();
http.configResponseTextCharset("utf-8");// 设置返回文本的编码, 默认编码UTF-8
//发送请求,分别设置传送方式、url、传递数据、回调组件
httpUtils.send(HttpMethod.POST, "http://192.168.2.178:8080/21-sun/PhotosServlet", params, new RequestCallBack<String>(){
@Override
public void onFailure(HttpException e, String m) {//执行失败回调方法
Log.i("jereh", e.getExceptionCode()+" "+m);
}
@Overrid
public void onSuccess(ResponseInfo<String> info) {
//执行成功回调方法,并传入数据,通过info.result获得返回数据
}
});
2、使用BitmapUtils图片的异步加载
使用BitmapUtils图片的异步加载,支持本地和网络图片, 图片的压缩处理。
(1)、BitmapDisplayConfig图片显示的配置
BitmapDisplayConfig bigPicDisplayConfig = new BitmapDisplayConfig();
// 显示原始图片,不压缩, 尽量不要使用, 图片太大时容易OOM。
bigPicDisplayConfig.setShowOriginal(true); bigPicDisplayConfig.setBitmapConfig(Bitmap.Config.RGB_565);
//设置图片的最大尺寸, 不设置时更具控件属性自适应
displayConfig.setBitmapMaxSize(BitmapCommonUtils.getScreenSize(mActivity));
//实现一个渐变动画。
AlphaAnimation animation=new AlphaAnimation(0.1f,1.0f);
animation.setDuration(500);
displayConfig.setAnimation(animation);
(2) 创建BitmapUtils
构造:
/**
* @param context 上下文
* @param diskCachePath 磁盘高速缓存路径
* @param memoryCacheSize 内存缓存大小
* @param diskCacheSize 磁盘缓存空间大小
*/
BitmapUtils(Context context, String diskCachePath,
int memoryCacheSize, int diskCacheSize)
其他形式
BitmapUtils(Context context)
BitmapUtils(Context context, String diskCachePath)
BitmapUtils(Context context, String diskCachePath, int memoryCachePercent);
代码:
// 获取应用程序最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
FileUtils fileUtils=new FileUtils(mActivity, "jereh");
//设置文件缓存、内存缓存大小
BitmapUtils utils=new BitmapUtils(mActivity,fileUtils.getCacheDir(),cacheSize);
(3)display()方法异步加载图片并显示到View控件上
utils.display(T container , String uri, BitmapDisplayConfig displayConfig);
3、Gson组件实现json数据的解析
Gson gson=new Gson();//创建gson组件
//将服务器返回的JSON数据,使用Gson解析
List<ImageInfo> imageInfo=gson.fromJson(“JSON数据”,
new TypeToken<ArrayList<ImageInfo>>(){}.getType());
| 四、案例完整代码 |
1、PhotoBrowseAdapter适配器代码
public class PhotoBrowseAdapter extends PagerAdapter {
private Activity mActivity;
private List<ImageInfo> imageList;
private LayoutInflater inflate;
private BitmapUtils utils;
private BitmapDisplayConfig displayConfig;
public PhotoBrowseAdapter(Activity mActivity, List<ImageInfo> imageList) {
super();
this.mActivity = mActivity;
this.imageList = imageList;
inflate=LayoutInflater.from(mActivity);
// 获取应用程序最大可用内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
FileUtils fileUtils=new FileUtils(mActivity, "jereh");
utils=new BitmapUtils(mActivity,fileUtils.getCacheDir(),cacheSize);
displayConfig=new BitmapDisplayConfig();
//displayConfig.setShowOriginal(true); // 显示原始图片,不压缩, 尽量不要使用, 图片太大时容易OOM。
//utils.configDefaultBitmapMaxSize(BitmapCommonUtils.getScreenSize(mActivity));
displayConfig.setBitmapMaxSize(BitmapCommonUtils.getScreenSize(mActivity));
AlphaAnimation animation=new AlphaAnimation(0.1f,1.0f);
animation.setDuration(500);
displayConfig.setAnimation(animation);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return imageList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
@Override
public Object instantiateItem(View container,int position){
ImageInfo info=imageList.get(position);
LinearLayout view=(LinearLayout)inflate.inflate(R.layout.phone_item, null);
((TextView)view.findViewById(R.id.tvTitle)).setText(info.getImgTitle());
((TextView)view.findViewById(R.id.tvContent)).setText(info.getImgDesc());
ImageView img=(ImageView)view.findViewById(R.id.ivPhoto);
img.setTag(info.getImgUrl());
utils.display(img,info.getImgUrl(),displayConfig);
((ViewPager)container).addView(view);
return view;
}
@Override
public void destroyItem(View container,int position,Object obj){
((ViewPager)container).removeView((View)obj);
}
}
2、MainActivity代码
public class MainActivity extends Activity {
private ViewPager vpImagePager;
private PhotoBrowseAdapter adapter;
private List<ImageInfo> imageInfoList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vpImagePager=(ViewPager)super.findViewById(R.id.vpImgBrowse);
imageInfoList=new ArrayList<ImageInfo>();
adapter=new PhotoBrowseAdapter(this,imageInfoList);
loadData();
}
private void loadData(){
RequestParams params=new RequestParams();
params.addQueryStringParameter("categoryId","2");//设置参数
HttpUtils httpUtils=new HttpUtils();
//向服务器发送请求
httpUtils.send(HttpMethod.POST, "http://192.168.2.178:8080/21-sun/PhotosServlet",
params,new RequestCallBack<String>(){
@Override
public void onFailure(HttpException e, String m) {
Log.i("jereh", e.getExceptionCode()+" "+m);
}
@Override
public void onSuccess(ResponseInfo<String> info) {//后台执行完成后回调,并传入返回数据
Gson gson=new Gson();//创建gson组件
//将info.result服务器返回的JSON数据,使用Gson解析
List<ImageInfo> imageInfo=gson.fromJson(info.result,
new TypeToken<ArrayList<ImageInfo>>(){}.getType());
imageInfoList.addAll(imageInfo);
vpImagePager.setAdapter(adapter);
}
});
}
}
3、ImageInfo实体类和 FileUtils工具类
//封装图片信息
public class ImageInfo {
private String imgUrl;
private String imgTitle;
private String imgDesc;
…//省略
}
FileUtils获得文件缓存目录
public class FileUtils {
/** 缓存文件目录 */
private File mCacheDir;
public FileUtils(Context context, String cacheDir){
if (android.os.Environment.getExternalStorageState().
equals(android.os.Environment.MEDIA_MOUNTED))
mCacheDir = new File(cacheDir);
else
mCacheDir = context.getCacheDir();// 如何获取系统内置的缓存存储路径
if(!mCacheDir.exists())
mCacheDir.mkdirs();
}
public String getCacheDir(){
return mCacheDir.getAbsolutePath();
}
4、服务端PhotosServlet代码
public void doPost (HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/json;charset=utf-8");
String categoryId=request.getParameter("categoryId");//测试传递参数
System.out.println(categoryId);
List<ImagePart> partList=new ArrayList<ImagePart>();
ImagePart part1=new ImagePart(); part1.setImgUrl("http://news.21-sun.com/UserFiles/x_Image/x_20150216131001_0.jpg");
part1.setImgTitle("代表中国的东风队,加油!");
part1.setImgDesc("...");
ImagePart part2=new ImagePart();
part2.setImgUrl("http://news.21-sun.com/UserFiles/x_Image/x_20150216131432_0.jpg");
part2.setImgTitle("三亚沃帆赛体验之旅");
part2.setImgDesc("...");
ImagePart part3=new ImagePart();
part3.setImgUrl("http://news.21-sun.com/UserFiles/x_Image/x_20150216131157_0.jpg");
part3.setImgTitle("沃尔沃集团总裁兼首席执行官欧罗夫•佩森与沃尔沃");
part3.setImgDesc("...");
partList.add(part1);partList.add(part2);partList.add(part3);
JSONArray jsonArray=JSONArray.fromObject(partList,config);
response.getWriter().println(jsonArray.toString());
}
想要了解更多内容的小伙伴,可以点击查看源码,亲自运行测试。
疑问咨询或技术交流,请加入官方QQ群:
(452379712)
出处:http://www.cnblogs.com/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Android批量图片加载经典系列——使用xutil框架缓存、异步加载网络图片的更多相关文章
- Android批量图片加载经典系列——采用二级缓存、异步加载网络图片
一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络. ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载
一.问题描述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存加载(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html# ...
- Android批量图片加载经典系列——Volley框架实现多布局的新闻列表
一.问题描述 Volley是Google 2013年发布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方案,比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdap ...
- Android批量图片载入经典系列——使用LruCache、AsyncTask缓存并异步载入图片
一.问题描写叙述 使用LruCache.AsyncTask实现批量图片的载入并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)载入图片,并放入缓存中 2.及时 ...
- Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入
一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...
- Android图片管理组件(双缓存+异步加载)
转自:http://www.oschina.net/code/snippet_219356_18887?p=3#comments ImageManager2这个类具有异步从网络下载图片,从sd读取本地 ...
- 【框架】异步加载大量图片--ImageLoader
public abstract class BaseImageLoaderProvider { public abstract void loadImage(Context ctx, ImageLoa ...
- Android批量图片加载经典系列——使用二级缓存、异步网络负载形象
一.问题描写叙述 Android应用中常常涉及从网络中载入大量图片,为提升载入速度和效率,降低网络流量都会採用二级缓存和异步载入机制.所谓二级缓存就是通过先从内存中获取.再从文件里获取,最后才会訪问网 ...
随机推荐
- 温故而知新--JavaScript书摘(二)
前言 毕业到入职腾讯已经差不多一年的时光了,接触了很多项目,也积累了很多实践经验,在处理问题的方式方法上有很大的提升.随着时间的增加,愈加发现基础知识的重要性,很多开发过程中遇到的问题都是由最基础的知 ...
- LeetCode | Reverse Words in a String(C#)
题目: Given an input string, reverse the string word by word. For example,Given s = "the sky is b ...
- 老方块Oracle--数值类型性能考虑
我们在设计数据库表,或者在使用SQL,写程序时都会经常用到数值类型.比如常见的number.int.float. float是浮点类型,也属于数值类型,我们最常用的是number类型. 他的格式是nu ...
- DailyWallpaper v1.03 released
根据这一段时间的使用发现了一些问题,重新修正一下. 修正电脑从休眠状态中恢复时如果没有网络连接程序报错的bug. 添加了异常处理语句,防止抓取网页数据时的错误. 这个版本将是最后一个bug fix版本 ...
- poj 1679 判断MST是不是唯一的 (次小生成树)
判断MST是不是唯一的 如果是唯一的 就输出最小的权值和 如果不是唯一的 就输出Not Unique! 次小生成树就是第二小生成树 如果次小生成树的权值和MST相等 那么MST就不是唯一的 法一: ...
- 乐观锁和悲观锁及CAS实现
乐观锁与悲观锁 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很多这种锁机制, ...
- java:冒泡排序、选择排序、插入排序实现
整数排序 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法. 样例 样例 1: 输入: [3, 2, 1, 4, 5] 输出: [1, 2, 3, 4, 5] ...
- Codeforces 659G Fence Divercity dp
Fence Divercity 我们设a[ i ] 为第 i 个围栏被切的最靠下的位置, 我们发现a[ i ] 的最大取值有一下信息: 如果从i - 1过来并在 i 结束a[ i ] = min(h ...
- Teamviewer 远程控制时 无法正常操作鼠标点击
其中一种可能: 本机开启了360的64位Intel-VT核晶防护后,用Teamviewer远程到本机,远程电脑无法操作本机的鼠标点击(左右键都不行),查看日志显示拦截了模拟按键.关闭核晶防护就可以正常 ...
- RabbitMQ消息可靠性分析和应用
RabbitMQ流程简介(带Exchange) RabbitMQ使用一些机制来保证可靠性,如持久化.消费确认及发布确认等. 先看以下这个图: P为生产者,X为中转站(Exchange),红色部分为消息 ...