1. 程式人生 > >利用LruCache為GridView非同步載入大量網路圖片完整示例

利用LruCache為GridView非同步載入大量網路圖片完整示例

轉載:http://blog.csdn.net/lfdfhl/article/details/18350601

=============================================

MainActivity如下:

  1. package cc.testlrucache;  
  2. import android.os.Bundle;  
  3. import android.widget.GridView;  
  4. import android.app.Activity;  
  5. /** 
  6.  * Demo描述: 
  7.  * 在GridView中採用LruCache非同步載入大量圖片,避免OOM
     
  8.  *  
  9.  * 學習資料: 
  10.  * http://blog.csdn.net/guolin_blog/article/details/9526203 
  11.  * Thank you very much 
  12.  */
  13. publicclass MainActivity extends Activity {  
  14.     private GridView mGridView;  
  15.     private GridViewAdapter mGridViewAdapter;  
  16.     @Override
  17.     protectedvoid onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.         init();  
  21.     }  
  22.     privatevoid init(){  
  23.         mGridView = (GridView) findViewById(R.id.gridView);  
  24.         mGridViewAdapter = new GridViewAdapter(this0, ImagesUrl.Urls, mGridView);  
  25.         mGridView.setAdapter(mGridViewAdapter);  
  26.     }  
  27.     //取消所有的下載任務
  28.     @Override
  29.     protectedvoid onDestroy() {  
  30.         super.onDestroy();  
  31.         mGridViewAdapter.cancelAllTasks();  
  32.     }  
  33. }  


GridViewAdapter如下:

  1. package cc.testlrucache;  
  2. import java.net.HttpURLConnection;  
  3. import java.net.URL;  
  4. import java.util.HashSet;  
  5. import android.annotation.SuppressLint;  
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.os.AsyncTask;  
  10. import android.support.v4.util.LruCache;  
  11. import android.view.LayoutInflater;  
  12. import android.view.View;  
  13. import android.view.ViewGroup;  
  14. import android.widget.AbsListView;  
  15. import android.widget.AbsListView.OnScrollListener;  
  16. import android.widget.ArrayAdapter;  
  17. import android.widget.GridView;  
  18. import android.widget.ImageView;  
  19. /** 
  20.  * LruCache的流程分析: 
  21.  * 我們從第一次進入應用的情況下開始 
  22.  * 1 依據圖片的Url從LruCache快取中取圖片. 
  23.  *   若圖片存在快取中,則顯示該圖片;否則顯示預設圖片 
  24.  * 2 因為是第一次進入該介面所以會執行: 
  25.  *   loadBitmaps(firstVisibleItem, visibleItemCount); 
  26.  *   我們從loadBitmaps()方法作為切入點,繼續往下梳理 
  27.  * 3 嘗試從LruCache快取中取圖片.如果在顯示即可,否則進入4 
  28.  * 4 開啟一個非同步任務下載圖片.下載完成後顯示圖片,並且將 
  29.  *   該圖片存入LruCache快取中 
  30.  *    
  31.  * 在停止滑動時,會呼叫loadBitmaps(firstVisibleItem, visibleItemCount) 
  32.  * 情況與上類似 
  33.  */
  34. @SuppressLint("NewApi")  
  35. publicclass GridViewAdapter extends ArrayAdapter<String> {  
  36.     private GridView mGridView;  
  37.     //圖片快取類
  38.     private LruCache<String, Bitmap> mLruCache;  
  39.     //記錄所有正在下載或等待下載的任務
  40.     private HashSet<DownloadBitmapAsyncTask> mDownloadBitmapAsyncTaskHashSet;  
  41.     //GridView中可見的第一張圖片的下標
  42.     privateint mFirstVisibleItem;  
  43.     //GridView中可見的圖片的數量
  44.     privateint mVisibleItemCount;  
  45.     //記錄是否是第一次進入該介面
  46.     privateboolean isFirstEnterThisActivity = true;  
  47.     public GridViewAdapter(Context context, int textViewResourceId,String[] objects, GridView gridView) {  
  48.         super(context, textViewResourceId, objects);  
  49.         mGridView = gridView;  
  50.         mGridView.setOnScrollListener(new ScrollListenerImpl());  
  51.         mDownloadBitmapAsyncTaskHashSet = new HashSet<DownloadBitmapAsyncTask>();  
  52.         // 獲取應用程式最大可用記憶體
  53.         int maxMemory = (int) Runtime.getRuntime().maxMemory();  
  54.         // 設定圖片快取大小為maxMemory的1/6
  55.         int cacheSize = maxMemory/6;  
  56.         mLruCache = new LruCache<String, Bitmap>(cacheSize) {  
  57.             @Override
  58.             protectedint sizeOf(String key, Bitmap bitmap) {  
  59.                 return bitmap.getByteCount();  
  60.             }  
  61.         };  
  62.     }  
  63.     @Override
  64.     public View getView(int position, View convertView, ViewGroup parent) {  
  65.         String url = getItem(position);  
  66.         View view;  
  67.         if (convertView == null) {  
  68.             view = LayoutInflater.from(getContext()).inflate(R.layout.gridview_item, null);  
  69.         } else {  
  70.             view = convertView;  
  71.         }  
  72.         ImageView imageView = (ImageView) view.findViewById(R.id.imageView);  
  73.         //為該ImageView設定一個Tag,防止圖片錯位
  74.         imageView.setTag(url);  
  75.         //為該ImageView設定顯示的圖片
  76.         setImageForImageView(url, imageView);  
  77.         

    相關推薦

    利用LruCacheGridView非同步載入大量網路圖片完整示例

    轉載:http://blog.csdn.net/lfdfhl/article/details/18350601 ============================================= MainActivity如下: packa

    Android通過AsyncTask與ThreadPool(執行緒池)兩種方式非同步載入大量資料的分析與對比

    如果您認為本部落格不錯,讀後覺得有收穫,不妨打賞讚助我一下,讓我有動力繼續寫出高質量的部落格。 贈人玫瑰,手有餘香。分享技術,傳遞快樂。 有心課堂,傳遞的不僅僅是技術! QQ交流群:250468947 有心課堂會員,請加入VIP QQ交流

    使用select2分批非同步載入大量資料

    //select2選項                         var select2Conf = {"allowClear":allowClear,width:"100%"};                         //select2使用data list

    【安卓筆記】非同步載入大量圖片

    package cn.edu.chd.utils; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /** * @author Row

    GridView非同步載入本地圖片縮圖

    main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" and

    ListView與GridView非同步載入圖片

    原理很簡單,主要是用到了回撥方法,下面是非同步載入圖片的類 <span style="font-size:16px;">package com.xxx.xxx; import java.io.InputStream; import java.lang.ref.So

    使用開源imageLoader優化listview載入大量本地圖片的demo

    package com.example.listviewdemo; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.uti

    Android經典面試問題:請你設計一套圖片非同步載入快取方案——圖片的三級快取

    友情提示:文章最後附有專案原始碼現在,Android有很多優秀的圖片載入框架。例如:Picasso,Glide,Fresco。我們幾乎只要簡單呼叫幾句程式碼就可以很好的實現圖片的載入。很多時候也不需要我們親自去寫圖片載入方案。但是,學習圖片的三級快取策略無論是在面試時,還是對

    吐血中, 呼叫分享到微信好友,載入網路圖片顯示不出來,微信分享,自定義分享標題、內容描述關鍵詞限制(紅包)

    太坑爹了,嘗試吐血後,總結一番,這種問題,讓我從何說說起啊!!!!!!!分享後,自己能看到,自己分享的連結圖片,被分享人竟然看不到圖片!!原因何在我分享到對方微信好友,截圖展示:對方截圖展示:竟然是自定義title中,和content中,存在『紅包』兩個字的字眼,逼瘋了,去掉

    [Android]Html.from()中ImageGetter非同步載入並顯示圖片和替換標籤處理效果

    非同步載入圖片:先返回一個LevelListDrawable,之後載入圖片,獲取到Bitmap之後轉為Drawable,並設定到之前的LevelListDrawable中,更新level。這裡要注意,要重新設定一下Textview的text,不然圖片顯示不出來。 publ

    GridView實現載入本地所有圖片

    public class MainActivity extends Activity {private GridView gridView;// 獲取所有圖片的路徑List<String> imagePath = new ArrayList<String&

    Android開發網路圖片完整顯示且不拉伸

          需求:由上往下載入多張網路圖片,滿橫屏完整顯示且不拉伸。       這裡有幾個問題要解決的,一個是網路圖片,一個是完整顯示,一個是圖片不能出現拉伸問題。       解決思路:不拉伸完整顯示只有等比例縮放圖片,ImageView.ScaleType.CENTE

    使用AsyncTask非同步更新UI介面(載入網路圖片

    寫這個部落格時抽抽了,順便又用了一些WebView的東西,更多webview參見這裡 1.簡單介紹下AsyncTask AsyncTask,是android提供的輕量級的非同步類,可以直接繼承AsyncTask,在類中實現非同步操作,並提供介面反饋當前非同步執行的程度(可以

    iOS 非同步載入網路圖片,獲取圖片真實尺寸

    專案需求: 在網路上載入一組圖片的資料,並且這組圖片要按照比例展示出來 做法分析: (1)首頁介面上要是使用的圖片控制元件的建立,這裡的高度是用設定的高度,這部分需要在主執行緒完成; (2)第二部部分是獲取圖片的實際尺寸,這部分線上程中完成; (3)然後需要在主執行緒重新整

    IOS開發之非同步載入網路圖片並快取本地實現瀑布流(一)

    </pre><pre name="code" class="objc"></pre><pre name="code" class="objc">在前面的一篇部落格中,我寫了一個瀑布流照片牆的程式,由於之前的程式載入的圖片是本

    Android批量圖片載入經典系列——使用xutil框架快取、非同步載入網路圖片

    一、問題描述   為提高圖片載入的效率,需要對圖片的採用快取和非同步載入策略,編碼相對比較複雜,實際上有一些優秀的框架提供瞭解決方案,比如近期在git上比較活躍的xutil框架   Xutil框架提供了四大模組: 1、  DbUtil模組:採用ORM機制簡化Sqlite操作,

    Android批量圖片載入經典系列——採用二級快取、非同步載入網路圖片

    public class AsyncImageLoader{ private MemoryCache mMemoryCache;//記憶體快取 private FileCache mFileCache;//檔案快取 private ExecutorService mExecu

    Android 非同步載入圖片-LruCache和SD卡或手機快取-三級快取原理載入圖片

    非同步載入圖片的例子,網上也比較多,大部分用了HashMap<String, SoftReference<Drawable>> imageCache ,但是現在已經不再推薦使用這種方式了,因為從 Android 2.3 (API Level 9)開始,垃圾回

    網路請求httpurlconnection ,非同步載入 放入viewpage中

    package com.bwei.viewpagedemo; import android.os.AsyncTask; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCo

    iOS非同步載入網路圖片

    在iOS中載入網路圖片有多種方式: 法1:在主執行緒中同步載入網路圖片 在主執行緒中載入圖片,先將圖片的URL存放進NSURL,然後再用這個NSURL初始化NSData,再把UIImage用NSData初始化,就行了。程式碼如下: - (UITableViewCell *