一、问题描写叙述

  在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用。

  Afinal 是一个android的http框架、sqlite orm 和 ioc 框架。使其更加简单易用,Afinal的宗旨是简洁,高速。约定配置的方式之后,尽量一行代码完毕全部事情,代码入侵性小,在三者中比較推荐。在这里我们主要使用http框架的 FinalHttp和FinalBitmap组件实现网络图片的载入

  案例介绍——实现图片新闻浏览:

二、案例主要组件

  1、FinalHttp用法:FinalHttp  fh=new FinalHttp();

  (1)发送Post方式请求

        fh.post(url, new AjaxCallBack<String>(){@Overridepublic void onFailure(Throwable t, String strMsg) {//请求失败调用super.onFailure(t, strMsg);}@Overridepublic void onLoading(long count, long current) {//请求过程中没一秒回调一次super.onLoading(count, current);}@Overridepublic void onStart() {//開始异步请求时调用super.onStart();}@Overridepublic void onSuccess(String t) {//请求成功调用,并接受返回结果});

  (2)发送Get方式请求

fh.get(url, callBack);使用方法同Post方式

  (3)下载文件

  方法參数分别表示下载文件的url、文件保存目标、AjaxCallBack回调方法

fh.download(url, "/mnt/sdcard/21-sun.apk", new AjaxCallBack<File>(){@Overridepublic void onLoading(long count, long current) {// TODO Auto-generated method stubtvProcess.setText("下载进度"+(current/count));}@Overridepublic void onSuccess(File f) {//请求成功调用,并接受返回结果tvFileName.setText(f==null?

"":f.getAbsoluteFile().toString()); } });

  2、向服务端传递參数

AjaxParams params=new AjaxParams();//设置请求參数
params.put("category", "today");

  调用fh.get(url,params,ajaxCallback)或fh.post(url,params,ajaxCallback)方法传递数据

  jsp服务端

  通过request.getParameter(“category”);获得文本參数

  也可上传文件

  params.put(“profile_picture”,new File(“/mnt/sdcard/head.jpg”))或

  params.put(“profile_picture”,InputStream);

  服务端

  可使用commfileupload组件实现上传

  3、FinalBitmap实现缓存并异步载入网络图片

    //创建FinalBitmap,并设置文件缓存的位置、内存缓存的百分比(如:系统内存的1/8)FinalBitmap    fb=FinalBitmap.create(this, diskCachePath, memoryCacheSizePercent);//进行配置。可不设置fb.configLoadingImage(R.drawable.default_big);//设置图片正在载入的时候显示的图片
fb.configLoadfailImage(R.drawable.error_big);//设置图片载入失败时候显示的图片

  配置方法还有:

configBitmapMaxHeight(int bitmapHeight) // 配置默认图片的最大的高度configBitmapMaxWidth(int bitmapWidth) // 配置默认图片的最大的宽度configDisplayer(Displayer displayer)//设置显示器,比方在显示的过程中显示动画等//设置下载器。比方通过ftp或者其它协议去网络读取图片的时候能够设置这项
configDownlader(Downloader downlader) 

  最后调用display()完毕图片的载入:

<span style="white-space:pre">    </span>//第一參数表示显示图片的UI。第二參数为图片网络地址
<span style="white-space:pre"> </span>fb.display(view,url);//载入图片。先从缓存中载入,内存没有再从网络载入    

三、案例完整代码

1、SunNewsApplication组件

public class SunNewsApplication extends Application {private FinalBitmap fb;@Overridepublic void onCreate(){fb=FinalBitmap.create(this);fb.configLoadingImage(R.drawable.default_big);//  设置图片正在载入的时候显示的图片}public FinalBitmap getFinalBitmap(){return fb;}
}

2、编写适配器

public class MoreStyleNewsListViewAdapter extends BaseAdapter {private Activity mActivity;private List<NewsItem> newsList;private FinalBitmap imageLoader;public MoreStyleNewsListViewAdapter(Activity mActivity,List<NewsItem> newsList){this.mActivity=mActivity;this.newsList=newsList;imageLoader=((SunNewsApplication)mActivity.getApplication()).getFinalBitmap();}private final int TYPE_COUNT=2;/*** 返回数据项的显示类型数据* 0 1 2*/@Overridepublic int getItemViewType(int position) {// TODO Auto-generated method stubreturn newsList!=null?

newsList.get(position).getStyle():-1; } /** * 返回类型个数 */ @Override public int getViewTypeCount() { // TODO Auto-generated method stub return TYPE_COUNT; } @Override public int getCount() { // TODO Auto-generated method stub Log.d("jereh","getCount()"); return newsList.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub Log.d("jereh","getItem()"); return newsList.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub Log.d("jereh","getItemId()"); return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder=null; NewsItem item=newsList.get(position); if(convertView==null){ holder=new ViewHolder(); //将layout.xml转换为View switch(item.getStyle()){ case 0: convertView=LayoutInflater.from(mActivity).inflate(R.layout.news_item1, null); holder.ivImg1=(ImageView)convertView.findViewById(R.id.ivNewsImg); break; case 1: convertView=LayoutInflater.from(mActivity).inflate(R.layout.news_item2, null); holder.ivImg1=(ImageView)convertView.findViewById(R.id.ivImg1); holder.ivImg2=(ImageView)convertView.findViewById(R.id.ivImg2); holder.ivImg3=(ImageView)convertView.findViewById(R.id.ivImg3); break; } holder.tvTilte=(TextView)convertView.findViewById(R.id.tvTitle); convertView.setTag(holder);//记录个标识 }else{ holder=(ViewHolder)convertView.getTag(); } //向ui元素绑定数据 holder.tvTilte.setText(item.getTitle()); imageLoader.display(holder.ivImg1, item.getImgUrl()[0]);//载入图片。先从缓存中载入,内存没有再从网络载入 switch(item.getStyle()){ case 1: imageLoader.display(holder.ivImg2, item.getImgUrl()[1]);//载入图片,先从缓存中载入,内存没有再从网络载入 imageLoader.display(holder.ivImg3, item.getImgUrl()[2]);//载入图片,先从缓存中载入,内存没有再从网络载入 break; } Log.d("jereh","getView()"); return convertView; } private class ViewHolder{ private TextView tvTilte; private ImageView ivImg1; private ImageView ivImg2; private ImageView ivImg3; } }

3、编写MaintActivity

public class MainActivity extends Activity {private RadioGroup rgChannel;private List<NewsItem> newsList=new ArrayList<NewsItem>();private MoreStyleNewsListViewAdapter adapter;private ListView newsListView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);initView();requestData();}private void initView(){rgChannel=(RadioGroup)super.findViewById(R.id.rgChannel);rgChannel.check(R.id.rbToday);newsListView=(ListView)super.findViewById(R.id.lvNews);adapter=new MoreStyleNewsListViewAdapter(this,newsList);newsListView.setAdapter(adapter);}/*** 异步请求获得网络数据*/private void requestData(){String url="http://192.168.0.107:8080/21-sun/NewsListServlet";FinalHttp fh=new FinalHttp();AjaxParams params=new AjaxParams();//设置请求參数params.put("category", "today");fh.post(url, params,new AjaxCallBack<String>(){@Overridepublic void onFailure(Throwable t, String strMsg) {//请求失败调用// TODO Auto-generated method stubLog.d("jereh",strMsg);}@Overridepublic void onSuccess(String t) {//请求成功调用。并接受返回结果// TODO Auto-generated method stubGson gson=new Gson();List list=gson.fromJson(t, new TypeToken<ArrayList<NewsItem>>(){}.getType());newsList.addAll(list);adapter.notifyDataSetChanged();}});}

  想要了解很多其它内容的小伙伴,能够点击查看源代码,亲自执行測试。

  疑问咨询或技术交流,请增加官方QQ群: (452379712)

作者:杰瑞教育
出处:http://blog.csdn.net/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有,欢迎转载。但未经作者允许必须保留此段声明。且在文章页面明显位置给出原文连接。否则保留追究法律责任的权利。

Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入相关推荐

  1. Android批量图片载入经典系列——使用LruCache、AsyncTask缓存并异步载入图片

    一.问题描写叙述 使用LruCache.AsyncTask实现批量图片的载入并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)载入图片,并放入缓存中 2.及时 ...

  2. android glide裁剪图片大小,Glide系列(二)------图片剪裁

    一.简介: 大家应该知道,我们在见面上显示的ImageView的大小和从网络取到的图片的大小是不一样的,最好的结果是网络图片刚好满足我们ImageView的尺寸,然而实际上,网络获取的图片或者从我们手 ...

  3. c罗图片带字经典语言,c罗励志图片文字壁纸 c罗带字图片

    1.我的终极梦想是为我的国家效力,帮助葡萄牙赢得世界杯.如果我赢得明年的巴西世界杯,我将在我的职业生涯中没有遗憾,我将退役. 2.无论你取得了多大的成功,你都不应该忘记曾经帮助过你的人或朋友.弗格森在 ...

  4. Android批量图片加载经典系列——使用二级缓存、异步网络负载形象

    一.问题描写叙述 Android应用中常常涉及从网络中载入大量图片,为提升载入速度和效率,降低网络流量都会採用二级缓存和异步载入机制.所谓二级缓存就是通过先从内存中获取.再从文件里获取,最后才会訪问网 ...

  5. Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片

    一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...

  6. android异步加载图片并缓存到内存和sd卡上,Android批量图片加载经典系列——采用二级缓存、异步加载网络图片...

    http://www.cnblogs.com/jerehedu/p/4560119.html 2015-06-08 09:20 by 杰瑞教育, 232 阅读, 1 评论, 收藏, 编辑一.问题描述 ...

  7. 常见Android开源框架使用笔记之——afinal框架

    从今天开始我们来学习框架思维,努力成为一个架构师,学习的开始先从别人的代码中获取这种思维,看看大牛们是怎么实现的.在分析代码的过程的同时也是对知识的巩固和对自己分析能力和知识层面的提高.本篇参考于网络 ...

  8. afinal框架之Android视频下载,指定路径

    afinal框架作为最受欢迎的安卓框架之一,它的功能也是尤其多的,主要分为下面4大模块: 1.FinalDB模块:android中的orm框架,一行代码就可以进行增删改查.支持一对多,多对一等查询. ...

  9. Android开发常用开源框架:图片处理

    1. 图片加载,缓存,处理 框架名称 功能描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时 Picasso 一个强大的图片下载与缓存的库 ...

最新文章

  1. 主梁弹性模量计算_收藏 | 钢结构计算公式
  2. 迅雷影音怎样 1.5倍速度播放
  3. python-类思想-实现简单增删查改
  4. Struts2学习第三课 Struts2详解
  5. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
  6. 下载mrt需要java_MRT Lab | 下载
  7. dbeaver生成结构图_DBeaver的简易操作和建议(一个神奇的数据库操作软件)
  8. html如何导入字体样式表,导入html字体及其样式变体?
  9. Blender建模与3D打印
  10. Quant量化面试题 数学 逻辑题 过河、生日、烧绳、称重
  11. HTML,CSS中的复合写法总结
  12. 电信机顶盒中心服务器连接异常,电信电视盒子连不上网的解决方法
  13. 如何利用腾讯云服务器搭建个人网站
  14. 如何开发短信通知和语音功能医院信息系统(HIS系统)
  15. JS数组Arry 操作方法速记
  16. 第4章-一阶多智体系统一致性 -> 连续时间系统一致性
  17. 微信小程序实现分页加载,触底加载下一页,滚动加载
  18. 我终于刷完了《觉醒年代》,对PMP有了新的思考...
  19. 用python将GBK编码文件转为UTF-8编码文件
  20. Artifactory Maven 使用教程

热门文章

  1. java instanceof 报错_java instanceof方法
  2. 用c自制编程语言,(怒)自制编程语言
  3. linux 雷电接口,Intel完全开放雷电技术:底层融合USB 4
  4. bartender外部表不是预期格式_批量合并Excel数据时“外部表不是预期格式”或“文件包含损坏数据”的两种情况...
  5. android8 通知呼吸灯_Android中通知Notification使用实例(振动、灯光、声音)
  6. 10 ping不通widwos7 windwos_弱电老司机总结的10种视频监控系统故障解决方法,学会,事半功倍...
  7. Java项目:网上电子书城项目(java+SSM+JSP+maven+Mysql)
  8. Java项目:垃圾分类查询管理系统(java+SSM+jsp+MySQL+bootstrap)
  9. python数据分析设置_Python 数据分析系列之如何安装和设置 Python
  10. append函数_连载|想用Python做自动化测试?函数的参数传递机制及变量作用域