高效加载大图片

出处:http://blog.csdn.net/guolin_blog/article/details/9316683

查看每个应用最高可分配内存

int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  

Log.d("TAG", "Max memory is " + maxMemory + "KB");  //131072keyong 

高效加载大图片

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 heightRatio = Math.round((float) height / (float) reqHeight);  

final int widthRatio = Math.round((float) width / (float) reqWidth);  

// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高  

// 一定都会大于等于目标的宽和高。  

        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;  

    }  

return inSampleSize;  

}  


public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,  

int reqWidth, int reqHeight) {  

// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小  

final BitmapFactory.Options options = new BitmapFactory.Options();  

options.inJustDecodeBounds =true;  

    BitmapFactory.decodeResource(res, resId, options);  

// 调用上面定义的方法计算inSampleSize值  

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);  

// 使用获取到的inSampleSize值再次解析图片  

options.inJustDecodeBounds =false;  

return BitmapFactory.decodeResource(res, resId, options);  

}  


mImageView.setImageBitmap(  

decodeSampledBitmapFromResource(getResources(), R.id.myimage,100, 100));  

使用图片缓存技术


private LruCache mMemoryCache;  


@Override  

protected void onCreate(Bundle savedInstanceState) {  

// 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。  

// LruCache通过构造函数传入缓存值,以KB为单位。  

int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  

// 使用最大可用内存值的1/8作为缓存的大小。  

int cacheSize = maxMemory / 8;  

mMemoryCache =new LruCache(cacheSize) {  

@Override  

protected int sizeOf(String key, Bitmap bitmap) {  

// 重写此方法来衡量每张图片的大小,默认返回图片数量。  

return bitmap.getByteCount() / 1024;  

        }  

    };  

}  


public void addBitmapToMemoryCache(String key, Bitmap bitmap) {  

if (getBitmapFromMemCache(key) == null) {  

        mMemoryCache.put(key, bitmap);  

    }  

}  


public Bitmap getBitmapFromMemCache(String key) {  

return mMemoryCache.get(key);  

}  


public void loadBitmap(int resId, ImageView imageView) {  

final String imageKey = String.valueOf(resId);  

final Bitmap bitmap = getBitmapFromMemCache(imageKey);  

if (bitmap != null) {  

        imageView.setImageBitmap(bitmap);  

}else {  

        imageView.setImageResource(R.drawable.image_placeholder);  

BitmapWorkerTask task =new BitmapWorkerTask(imageView);  

        task.execute(resId);  

    }  

}  


class BitmapWorkerTask extends AsyncTask {  

// 在后台加载图片。  

@Override  

protected Bitmap doInBackground(Integer... params) {  

final Bitmap bitmap = decodeSampledBitmapFromResource(  

getResources(), params[0], 100, 100);  

addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);  

return bitmap;  

    }  

}  

你可能感兴趣的:(高效加载大图片)