我昨天写了关于内存泄漏和内存不足的文章。
看我的帖子:
我得到了一些使用内存分析器的好技巧,我开始使用它,我可能找到了一些东西,但我无法解决它。在 DDMS 中,可以选择跟踪对象的分配。在单击子列表项(将 9 个图像加载到滚动视图中)时,我发现了一些有趣的东西。) 图像应该被分配 9 次 - 但我可以看到它被分配了 27 次。由于 Bitmap-class 的 createScaledBitmap-method 分配了 9 次,然后由于 BitmapFactory-class 的调用分配了 18 次。为什么???
我将在下面发布缩小位图的方法。代码可以写得更好吗?为 9 张图像分配 27 次资源是否符合逻辑?例如,我是否多次调用 BitmapFactory.decodeResource?但我只能回收一次。
下面的importand方法是decodeSampledBitmapFromResource
非常感谢答案!!!
/**
*
* @param options
* @param reqW
* @param reqH
* @return
*/
public int calculateInSampleSize(BitmapFactory.Options options, int reqW, int reqH) {
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
int inSampleSize = 1;
if (imageHeight > reqH || imageWidth > reqW) {
int heightRatio = Math.round((float) imageHeight / (float) reqH);
int widthRatio = Math.round((float) imageWidth / (float) reqW);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
System.out.println("i if-satsen!");
System.out.println("height-ratio: " + heightRatio + "\nwidth-ratio: " + widthRatio);
}
System.out.println("samplesize: " + inSampleSize);
inSampleSize = inSampleSize;
return inSampleSize;
}
@SuppressLint("NewApi")
/**
*
* @param res
* @param resId
* @param reqW
* @param reqH
* @return
*/
public Bitmap[] decodeSampledBitmapFromResource(Resources res, int[] resId, int[] reqW, int[] reqH) {
this.scaledBitmap = new Bitmap[resId.length];
BitmapFactory.Options options;
for (int i = 0; i < resId.length; i++) {
options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId[i], options);
System.out.println("ursprunglig bild: h = " + options.outHeight + " w = " + options.outWidth);
options.inSampleSize = calculateInSampleSize(options, reqW[i], reqH[i]);
while (options.outHeight < reqH[i] || options.outWidth < reqW[i]) {
options.inSampleSize--;
System.out.println("räknar nu ner insampleseize\ninSamleSize =" + options.inSampleSize);
}
options.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeResource(res, resId[i], options);
System.out.println("innan omskalning: h = " + options.outHeight + " w = " + options.outWidth);
System.out.println("antalet bytes: " + bm.getByteCount());
System.out.println("native free size: " + Debug.getNativeHeapFreeSize() );
this.scaledBitmap[i] = Bitmap.createScaledBitmap(bm, reqW[i], reqH[i], true);
bm.recycle();
}
System.gc();
return this.scaledBitmap;
}