zoukankan      html  css  js  c++  java
  • Android批量图片加载经典系列——afinal框架实现图片的异步缓存加载

    一、问题描述

      在之前的系列文章中,我们使用了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群:JRedu技术交流 (452379712)

    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    053-98
    053-672
    053-675
    1031 Hello World for U (20分)
    1065 A+B and C (64bit) (20分)
    1012 The Best Rank (25分)
    1015 Reversible Primes (20分)
    1013 Battle Over Cities (25分)
    1011 World Cup Betting (20分)
    1004 Counting Leaves (30分)
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4632350.html
Copyright © 2011-2022 走看看