博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载
阅读量:7227 次
发布时间:2019-06-29

本文共 7973 字,大约阅读时间需要 26 分钟。

一、问题描述

  在之前的系列文章中,我们使用了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
(){ @Override public void onFailure(Throwable t, String strMsg) {
//请求失败调用 super.onFailure(t, strMsg); } @Override public void onLoading(long count, long current) {
//请求过程中没一秒回调一次 super.onLoading(count, current); } @Override public void onStart() {
//开始异步请求时调用 super.onStart(); } @Override public void onSuccess(String t) {
//请求成功调用,并接受返回结果 });

  (2)发送Get方式请求

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

  (3)下载文件

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

fh.download(url, "/mnt/sdcard/21-sun.apk", new AjaxCallBack
(){ @Override public void onLoading(long count, long current) { // TODO Auto-generated method stub tvProcess.setText("下载进度"+(current/count)); } @Override public 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()完成图片的加载:

//第一参数表示显示图片的UI,第二参数为图片网络地址fb.display(view,url);//加载图片,先从缓存中加载,内存没有再从网络加载
三、案例完整代码

1、SunNewsApplication组件

public class SunNewsApplication extends Application {    private FinalBitmap fb;    @Override    public 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
newsList; private FinalBitmap imageLoader; public MoreStyleNewsListViewAdapter(Activity mActivity,List
newsList){ this.mActivity=mActivity; this.newsList=newsList; imageLoader=((SunNewsApplication)mActivity.getApplication()).getFinalBitmap(); } private final int TYPE_COUNT=2; /** * 返回数据项的显示类型数据 * 0 1 2 */ @Override public int getItemViewType(int position) { // TODO Auto-generated method stub return 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
newsList=new ArrayList
(); private MoreStyleNewsListViewAdapter adapter; private ListView newsListView; @Override protected 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
(){ @Override public void onFailure(Throwable t, String strMsg) {
//请求失败调用 // TODO Auto-generated method stub Log.d("jereh",strMsg); } @Override public void onSuccess(String t) {
//请求成功调用,并接受返回结果 // TODO Auto-generated method stub Gson gson=new Gson(); List list=gson.fromJson(t, new TypeToken
>(){}.getType()); newsList.addAll(list); adapter.notifyDataSetChanged(); } }); }

 

  想要了解更多内容的小伙伴,可以点击,亲自运行测试。

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

作者:
出处:
 
本文版权归和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 

转载于:https://www.cnblogs.com/jerehedu/p/4632350.html

你可能感兴趣的文章
终于找到解决方案了,Qt的Model/View Framework解析
查看>>
线程信息的获取和设置
查看>>
Databricks Scala 编程风格指南
查看>>
Tkinter,label内容随多选框变化
查看>>
PHP开发中的数据类型 ( 第3篇 ) :Heaps
查看>>
网络七层协议
查看>>
4种删除Word空白页的小技巧,都是你需要用到的!
查看>>
单服务器MySQL主从复制实践
查看>>
CentOS 7 root口令恢复
查看>>
| 刘知远:让计算机听懂人话
查看>>
苹果收购初创公司Tueo Health,哮喘监测或将应用到Apple Watch
查看>>
CLR存储过程
查看>>
初级运维(一)
查看>>
C语言字符串常用函数学习(一)
查看>>
Lync Server 2010部署与应用(三)---拓扑生成与发布
查看>>
安全摘记1:关于安全与黑客
查看>>
我的友情链接
查看>>
tbox中vector容器的使用
查看>>
一个简单的PHP笔试题
查看>>
firebug重新载入页面获取源码
查看>>