標籤:
在之前的系列文章中,我們使用了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架構實現圖片的非同步緩衝載入