转载

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

一、问题描述

在之前的系列文章中,我们使用了Volley和Xutil框架实现图片的缓存加载(查看系列文章: http://www.cnblogs.com/jerehedu/p/4607599.html#pltpjz ),接下来我们再介绍一下afinal 框架的使用。

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

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

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

二、案例主要组件

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群: Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载 (452379712)

作者: 杰瑞教育

出处: http://www.cnblogs.com/jerehedu/

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

正文到此结束
Loading...