4

我昨天写了关于内存泄漏和内存不足的文章。

看我的帖子:

内存泄漏和内存不足

我得到了一些使用内存分析器的好技巧,我开始使用它,我可能找到了一些东西,但我无法解决它。在 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;
        }
4

0 回答 0