android加载大图滑动浏览OOM异常解决

来源:互联网 发布:mysql转换日期格式 编辑:程序博客网 时间:2024/06/02 00:58

人(鄙)狠(人)话(非)不(常)多(懒),直接上代码!

private LruCache mLruCache;private void setLruCache() {    if (mLruCache == null) {        mLruCache = LruCacheUtils.getBitmapCache();    }    //定义之前一定要先清理缓存,只存当前浏览图片的上一张和下一张    mLruCache.evictAll();    //获取当前图片的上一张图片路径,假如加入缓存    String lastPicPath = mPicList.get(Math.abs(mCurrentPosition - 1)).toString();    String nextPicPath = null;    Log.d(TAG, "current position: " + mCurrentPosition);    //获取当天图片的下一张图片路径,加入缓存    nextPicPath = mPicList.get(mCurrentPosition - 1).toString();    mLruCache.put(nextPicPath, getZoomBitmap(nextPicPath));    mLruCache.put(lastPicPath, getZoomBitmap(lastPicPath));}public static Bitmap getZoomBitmap(String srcPath) {    try {        Bitmap bmp = mImageUtils.getImage(srcPath);        if (bmp != null) {            return bmp;        }                BitmapFactory.Options newOpts = new BitmapFactory.Options();        newOpts.inJustDecodeBounds = true;                BitmapFactory.decodeStream(new FileInputStream(srcPath), null,                newOpts);                        int scale = calculateInSampleSize(newOpts.outWidth, newOpts.outHeight);        Log.i(TAG, scale + "scale");                newOpts.inSampleSize = scale;        newOpts.inJustDecodeBounds = false;        return BitmapFactory.decodeStream(                new FileInputStream(srcPath),                null, newOpts);    } catch (FileNotFoundException e) {        e.printStackTrace();        return null;    }}public static int calculateInSampleSize(int outWidth, int outHeight) {        int inSampleSize = 1;        if (outWidth > outHeight && outWidth > 280f) {            inSampleSize = (int) (outWidth / 280f);        } else if (outWidth < outHeight && outHeight > 280f) {            inSampleSize = (int) (outHeight / 280f);        } else if (outWidth == outHeight && outHeight > 280f) {            inSampleSize = (int) (outHeight / 280f);        }        if (inSampleSize <= 0) {            inSampleSize = 1;        }        Log.e(TAG, "inSampleSize = " + inSampleSize);        return inSampleSize;    }/** * 浏览当前图片,获取裁剪后的缓存图片 */ private Bitmap getBitmap2Cache(Uri picUri) {        if (mLruCache == null) {            mLruCache = LruCacheUtils.getBitmapCache();        }        Bitmap picBitmap = mLruCache.get(picUri.toString());        if (picBitmap != null) {            mImageSwitcher.setImageDrawable(new BitmapDrawable(picBitmap));        } else {            mImageSwitcher.setImageDrawable(new BitmapDrawable(getZoomBitmap(picUri.toString())));        }        return picBitmap;    }/** * 举一个向左滑动的例子 */private void leftSlide() {    setLruCache();    //动画    mImageSwitcher.setInAnimation(AnimationUtils.loadAnimation(        getApplication(), R.anim.right_in));    mImageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(        getApplication(), R.anim.left_out));    mCurrentPosition--;    Uri uri = Uri.parse(mPicList.get(mCurrentPosition).toString());    getBitmap2Cache(uri);    setTime(uri.toString());    mCount.setText(mLength - mCurrentPosition + "/" + mPicList.size());    setSwitchIcon(mCurrentPosition);}             

Lrucache是android的标准,防止OOM用这个最好不过了。