一、问题描述

  在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存加载(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#pltpjz),接下来我们再介绍一下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>(){
@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<File>(){
@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<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
*/
@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<NewsItem> newsList=new ArrayList<NewsItem>();
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<String>(){
@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<ArrayList<NewsItem>>(){}.getType());
newsList.addAll(list);
adapter.notifyDataSetChanged();
} });
}

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

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

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

Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载的更多相关文章

  1. Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入

    一.问题描写叙述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存载入,接下来我们再介绍一下afinal 框架的使用. Afinal 是一个android的http框架.sql ...

  2. Android批量图片加载经典系列——Volley框架实现多布局的新闻列表

    一.问题描述 Volley是Google 2013年发布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方案,比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdap ...

  3. Android批量图片加载经典系列——采用二级缓存、异步加载网络图片

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

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

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

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

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

  6. Android批量图片加载经典系列——使用xutil框架缓存、异步加载网络图片

    一.问题描述 为提高图片加载的效率,需要对图片的采用缓存和异步加载策略,编码相对比较复杂,实际上有一些优秀的框架提供了解决方案,比如近期在git上比较活跃的xutil框架 Xutil框架提供了四大模块 ...

  7. Android批量图片载入经典系列——Volley框架实现多布局的新闻列表

    一.问题描写叙述 Volley是Google 2013年公布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方式,比方曾经从网上下载图片的步骤可能是这种流程: 在ListAda ...

  8. 安装Windows 2008 操作系统时加载ServeRAID-MR10系列阵列卡驱动

    安装Windows 2008 操作系统时加载ServeRAID-MR10系列阵列卡驱动 适用机型: 所有System x3200 M2; 所有System x3250 M2; 所有System x33 ...

  9. Echarts 异步数据加载遇到的问题

    看了Echarts官网异步加载数据的Demo var myChart = echarts.init(document.getElementById('main')); // 显示标题,图例和空的坐标轴 ...

随机推荐

  1. strchr()的用法

    strchr()主要有2个最有用的用法: 第一个:搜索字符串在另一字符串中的第一次出现.并返回剩余的部分 $str = "hello_chrdai_1993"; $not_incl ...

  2. python3 + selenium 之文件上传下载

    文件上传 文件上传下载的联系html: uplad.html <html> <head> <meta http-equiv="content-type" ...

  3. python 全栈开发,Day93(vue内容补充,VueX)

    昨日内容回顾 1. 页面的布局 Vue中使用Bootstrap搭页面 1. 安装 1. npm install bootstrap@3.3.7 -S 2. 使用 1. import 'bootstra ...

  4. POJ 2752 Seek the Name, Seek the Fame(next数组运用)

    Seek the Name, Seek the Fame Time Limit: 2000MS        Memory Limit: 65536K Total Submissions: 24000 ...

  5. git merge简介

    git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上.我们可以运行git merge -h和git merge --help查看其命令,后者会直接转到一个网页(git的 ...

  6. VS2008中开发智能设备程序的一些总结收藏

    结合前几日开发的<全国大坝基础数据库采集端>中的PDA程序开发过程,对VS2008开发智能设备上的程序做个小总结. 1         程序结构 程序中包括四个部分: 1. 系统配置 这个 ...

  7. Java jvm 内存参数限制

    nohup java -jar -Xms3g -Xmx3g jenkins.war > jenkins.log 2>&1 &

  8. 020 Spark中分组后的TopN,以及Spark的优化(重点)

    一:准备 1.源数据 2.上传数据 二:TopN程序编码 1.程序 package com.ibeifeng.bigdata.spark.core import java.util.concurren ...

  9. 019 mapreduce的核心--shuffle理解,以及在shuffle中的优化

    关于shuffle的过程图. 一:概述shuffle Shuffle是mapreduce的核心,链接map与reduce的中间过程. Mapp负责过滤分发,而reduce则是归并整理,从mapp输出到 ...

  10. Ubuntu 18.04安装Codeblocks

    安装步骤: 一:首先安装简版CodeBlocks sudo apt install codeblocks 二:把编译环境,C库.C++库和Boost库装好 sudo apt install build ...