Android批量圖片載入經典系列——afinal架構實現圖片的非同步緩衝載入

來源:互聯網
上載者:User

標籤:

一、問題描述

  在之前的系列文章中,我們使用了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群: (452379712)


傑瑞教育
出處:http://blog.csdn.net/jerehedu/ 
本文著作權歸煙台傑瑞教育科技有限公司和CSDN共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。 

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android批量圖片載入經典系列——afinal架構實現圖片的非同步緩衝載入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.