一、问题描述
为提高图片加载的效率,需要对图片的采用缓存和异步加载策略,编码相对比较复杂,实际上有一些优秀的框架提供了解决方案,比如近期在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-8params.addQueryStringParameter("categoryId","2");//设置参数
(2) HttpUtils组件发送请求
HttpUtils http = new HttpUtils();http.configResponseTextCharset("utf-8");// 设置返回文本的编码, 默认编码UTF-8//发送请求,分别设置传送方式、url、传递数据、回调组件httpUtils.send(HttpMethod.POST, ":8080/21-sun/PhotosServlet", params, new RequestCallBack<String>(){@Overridepublic void onFailure(HttpException e, String m) {//执行失败回调方法Log.i("jereh", e.getExceptionCode()+" "+m);}@Overridpublic 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);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn imageList.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0==arg1;}@Overridepublic 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;}@Overridepublic void destroyItem(View container,int position,Object obj){((ViewPager)container).removeView((View)obj);}}
2、MainActivity代码我是在旅行吗?也许是的。