Android批量图片加载系列——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();

            }

           

        });

    }

全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 13:15
点赞 评论 收藏
分享
仁者伍敌:牛子这些人还会点一个自动回复,boss都不带回复的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务