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/ 
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM