Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入
一、问题描写叙述 |
在之前的系列文章中,我们使用了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>(){
@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()完毕图片的载入:
<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;
@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://blog.csdn.net/jerehedu/
本文版权归烟台杰瑞教育科技有限公司和CSDN共同拥有,欢迎转载。但未经作者允许必须保留此段声明。且在文章页面明显位置给出原文连接。否则保留追究法律责任的权利。
Android批量图片载入经典系列——afinal框架实现图片的异步缓存载入的更多相关文章
- Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载
一.问题描述 在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存加载(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html# ...
- Android批量图片载入经典系列——Volley框架实现多布局的新闻列表
一.问题描写叙述 Volley是Google 2013年公布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方式,比方曾经从网上下载图片的步骤可能是这种流程: 在ListAda ...
- Android批量图片载入经典系列——使用LruCache、AsyncTask缓存并异步载入图片
一.问题描写叙述 使用LruCache.AsyncTask实现批量图片的载入并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)载入图片,并放入缓存中 2.及时 ...
- Android批量图片加载经典系列——Volley框架实现多布局的新闻列表
一.问题描述 Volley是Google 2013年发布的实现Android平台上的网络通信库,主要提供网络通信和图片下载的解决方案,比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdap ...
- Android批量图片加载经典系列——使用二级缓存、异步网络负载形象
一.问题描写叙述 Android应用中常常涉及从网络中载入大量图片,为提升载入速度和效率,降低网络流量都会採用二级缓存和异步载入机制.所谓二级缓存就是通过先从内存中获取.再从文件里获取,最后才会訪问网 ...
- Android批量图片加载经典系列——采用二级缓存、异步加载网络图片
一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络. ...
- Android批量图片加载经典系列——使用LruCache、AsyncTask缓存并异步加载图片
一.问题描述 使用LruCache.AsyncTask实现批量图片的加载并达到下列技术要求 1.从缓存中读取图片,若不在缓存中,则开启异步线程(AsyncTask)加载图片,并放入缓存中 2.及时移除 ...
- Android Afinal框架
项目如图: 本文参考网络! Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少.在android应用开发中,通过 Afinal的ioc框架,诸如ui绑定 ...
- 开源项目之Android Afinal框架
项目如图: 本文参考网络! Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少.在android应用开发中,通过Afinal的ioc框架,诸如ui绑定, ...
随机推荐
- redis+spring配置
pom引入jedis的jar包 <dependency> <groupId>redis.clients</groupId> <artifactId>je ...
- 使用 HAProxy, PHP, Redis 和 MySQL 轻松构建每周上亿请求Web站点
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 【javaw.exe 两个】启动了两个javaw.exe 相关
大家开发 肯定见过 两条并存的现象吧! 关闭方式1: 在任务管理器中,挑选 内存占用较小的 那个 关闭即可!! 关闭方式2: 1.查找对应的端口占用的进程:netstat -aon|findstr ...
- python接口自动化8-参数化
前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死 (由于博客园登录机制 ...
- client_thread.c server_thread.c
client_thread.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> ...
- mybatis连接mysql数据库插入中文乱码
对于MySQL数据库的乱码问题,有两种情况: 1. mysql数据库编码问题(建库时设定). 2. 连接mysql数据库的url编码设置问题. 对于第一个问题,目前个人发现只能通过重新建库解决,建库的 ...
- android 模拟器无法ping通主机
很多时候我们通过adb 连接 android 模拟器调试网络程序,也许你能直接访问浏览器,浏览网站,但是却无法ping同局网的一个机器,比如: # ping www.sina.com ...
- Nodejs安装使用,以及不错的Nodejs或者JS资料整理
先按照这个教程来学习:Node.js教程 - 菜鸟教程网 在mac上使用brew安装了nodejs,中间还是用到了先下载到cache目录的方法. 但是后来发现这样按照的node,没有安装npm. 找到 ...
- dedecms织梦 标签远程文件写入漏洞
测试方法: @Sebug.net dis本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! 前题条件,必须准备好自己的dede数据库,然后插入数据: insert into d ...
- jquery easyui里datagrid用法记录
1.删除行方法(deleteRow) $(); //1代表选中的行索引 2.删除多行数据 var rows = $('#ruleManagementTable').datagrid("get ...