标签:
如何有效的加载一个bitmap,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这就导致加载Bitmap的时候很容易出现内存溢出。
因此,如何高效的加载bitmap是一个很重要也很容易被开发者忽略的问题。
public static Bitmap decodeSanpledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false; return BitmapFactory.decodeResource(res, resId, options); } public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHieght = height / 2; final int halfWidth = width / 2; while ((halfHieght / inSampleSize) >= reqHeight && (halfWidth / inSampleSize >= reqWidth)) { inSampleSize *= 2; } } return inSampleSize; }
public class LruCache<K, V> { private final LinkedHashMap<K, V> map;
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { // TODO Auto-generated method stub return bitmap.getRowBytes() * bitmap.getHeight() / 1024; } };
mMemoryCache.get(key); mMemoryCache.put(key, value);
public static DiskLruCache open(File directory,int appVersion,int valueCount,long manSize)
private static final long DISK_CACHE_SIZE=1024*1024*50; File diskCacheDir=getDiskCacheDir(mContext,"bitmap"); if(!diskCacheDir.exists()){ diskCacheDir.mkdir(); } mDiskLruCache=DiskLruCache.open(diskCacheDir,1,1,DISK_CACHE_SIZE);
private String hashKeyFormUrl(String url) { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance("MD5"); mDigest.update(url.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (Exception e) { // TODO: handle exception cacheKey = String.valueOf(url.hashCode()); } return cacheKey; } private String bytesToHexString(byte[] digest) { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); for (int i = 0; i < digest.length; i++) { String hex = Integer.toHexString(0xFF & digest[i]); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); }
String key=hashKeyFormUrl(url); DiskLruCache.Editor editor=mDiskLruCache.edit(key); if(editor!=null){ OutputStream outputStream=editor.newOutputStream(DISK_CACHE_INDEX); }
public boolean downloadUrlToStream(String urlString, OutputStream outputStream) { HttpURLConnection urlConnection = null; BufferedOutputStream out = null; BufferedInputStream in = null; try { final URL url = new URL(urlString); urlConnection = (HttpURLConnection) url.openConnection(); in = new BufferedInputStream(outputStream, IO_BUFFER_SIZE); int b; while ((b = in.read()) != -1) { out.write(b); } } catch (Exception e) { // TODO: handle exception } finally { if (urlConnection != null) { urlConnection.disconnect(); } MyUtils.close(out); MyUtils.close(in); } return false; }
OutputStream outputStream=editor.newOutputStream(DISK_CACHE_INDEX); if(downloadUrlToStream(url,outputStream)){ editor.commit(); }else{ editor.abort(); } mDiskLruCache.flush();经过上面的步骤,图片就已经被正确的写入到文件系统中了,接下来图片的获取操作就不需要请求网络了。
Bitmap bitmap = null; String key = hashKeyFormUrl(url); DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key); if (snapShot != null) { FileInputStream fileInputStream = (FileInputStream) snapShot .getInputStream(DISK_CACHE_INDEX); FileDescriptor fileDescriptor = fileInputStream.getFD(); bitmap = mImageResizer.decodeSampledBitmapFromFileDescriptor( fileDescriptor, reqWidth, reqHeight); if(bitmap!=null){ addBitmapToMemoryCache(key,bitmap); } }
标签:
原文地址:http://blog.csdn.net/zhuxiaoxuand/article/details/51213695