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

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

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用这个最好不过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值