首页 > 代码库 > 使用LruCache和DiskLruCache来下载图片
使用LruCache和DiskLruCache来下载图片
LruCache是一个非常好用的图片缓存工具:
主要做法是:滑动图片时将图片的bitmap缓存在LruCache<String, Bitmap>中,退出程序后将图片缓存进文件中。採用DiskLruCache mDiskLruCache
所以我们必须设置一个图片缓存的地址:
public void setImageCache(){ String strPath = null; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File sdFile = Environment.getExternalStorageDirectory(); strPath = sdFile.getAbsolutePath() + "/pic/"; File cacheFile = new File(strPath); if(!cacheFile.exists()){ cacheFile.mkdir(); } } else{ String strCacheDir = this.getCacheDir().getAbsolutePath(); strPath = strCacheDir + "/pic/"; } setCachePath(strPath); } private void setCachePath(String strPicCachePath){ if(TextUtils.isEmpty(strPicCachePath)){ return; } m_strPicCachePath = strPicCachePath; File cacheFile = new File(strPicCachePath); if(!cacheFile.exists()){ cacheFile.mkdir(); } } public String getCacheBmpPath(String strUrl){ if(TextUtils.isEmpty(m_strPicCachePath) || TextUtils.isEmpty(strUrl)){ return ""; } return m_strPicCachePath + StringUtil.MD5Encode(strUrl) + mFileExName;//".bmp"; }
然后写List的adapter:
private class ListAdapter extends BaseAdapter implements OnScrollListener { protected List<ShopData> items = new ArrayList<ShopData>(); protected static final int FETCH_IMAGE_MSG = 1; private LruCache<String, Bitmap> mMemoryCache; protected HashSet<ImageView> mItemsMissingImages = new HashSet<ImageView>(); protected ImageLoaderHandler mHandler; protected ImageLoader mImageFetcher; public static final int TIMEOUT = 30000;//超时时间30秒 private DiskLruCache mDiskLruCache; public ListAdapter() { super(); mHandler = new ImageLoaderHandler(); int maxMemory = (int) Runtime.getRuntime().maxMemory(); int mCacheSize = maxMemory / 8; // 给LruCache分配1/8 4M mMemoryCache = new LruCache<String, Bitmap>(mCacheSize) { // 必须重写此方法,来測量Bitmap的大小 @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } }; try { mDiskLruCache = DiskLruCache .open(new File(m_strPicCachePath), getAppVersion(MainActivityTest.this), 1, 10 * 1024 * 1024); } catch (IOException e) { e.printStackTrace(); } } /** * 将缓存记录同步到journal文件里。*/ public void fluchCache() { if (mDiskLruCache != null) { try { mDiskLruCache.flush(); } catch (IOException e) { e.printStackTrace(); } } } @Override public int getCount() { return items.size(); } @Override public Object getItem(int position) { return items.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ShopDataTag tag = new ShopDataTag(); if (convertView == null) { convertView = mInflater.inflate(R.layout.listitem, null); tag.name = (TextView) convertView.findViewById(R.id.name); tag.shopInfo = (TextView) convertView.findViewById(R.id.info); tag.icon = (ImageView) convertView.findViewById(R.id.image_icon); convertView.setTag(tag); } else { tag = (ShopDataTag) convertView.getTag(); } TextView name = tag.name; TextView info = tag.shopInfo; ImageView imageView = tag.icon; ShopData data = http://www.mamicode.com/items.get(position);"HttpUtil", "get MalformedURL", ex); return false; } InputStream input = null; HttpURLConnection conn = null; try { conn = (HttpURLConnection)getUrl.openConnection(); conn.setConnectTimeout(TIMEOUT); conn.setReadTimeout(TIMEOUT); conn.setDoInput(true); conn.connect(); input = conn.getInputStream(); in = new BufferedInputStream(input, 8 * 1024); out = new BufferedOutputStream(fos, 8 * 1024); int b; while ((b = in.read()) != -1) { out.write(b); } return true; } catch (Exception ex) { Log.e("HttpUtil", "downloadImage", ex); } catch(OutOfMemoryError ex){ ex.printStackTrace(); } finally { try { if(out != null){ out.close(); out = null; } if (in != null){ in.close(); in = null; } if (conn != null){ conn.disconnect(); conn = null; } } catch (Exception ex) { Log.e("HttpUtil", "downloadImage finally", ex); } } return false; } private boolean getResponse(InputStream input, OutputStream os, byte[] data) throws IOException{ if(input == null || os == null || data =http://www.mamicode.com/= null){>
效果图:
代码:http://download.csdn.net/detail/baidu_nod/7777137
使用LruCache和DiskLruCache来下载图片