【第22期】观点:IT 行业加班,到底有没有价值?

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

原创 2015年07月09日 10:30:55
一、问题描述

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


作者:杰瑞教育
出处:http://blog.csdn.net/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

GitHub 优秀的 Android 开源项目和框架

GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品) 博客分类:  Android 开源集合  ...

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

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

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Android Handler 异步消息处理机制的妙用 创建强大的图片加载类

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38476887,本文出自【张鸿洋的博客】 最近创建了一个群,方便大家交流,群号:<span style="

android异步图片加载三之handler+线程池+消息队列模式+缓存

假象现在有这样一个需求: <p style="text-align: left; line-height: 25px; padding-top: 0px; padding-bottom: 0px; font-
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)