4

昨日、メモリリークとメモリ不足について書きました。

私の投稿を参照してください:

メモリリークとメモリ不足

メモリー・プロファイラーを使用するための良いヒントをいくつか得て、それを使い始めました。何かを見つけたかもしれませんが、解決できませんでした。DDMS では、オブジェクトの割り当てを追跡することを選択できます。サブリストアイテムをクリックしているときに興味深いものを見つけました(9つの画像をスクロールビューにロードします)。) 画像は 9 回割り当てられる必要がありますが、27 回割り当てられていることがわかりました。Bitmap-class の createScaledBitmap-method により 9 回割り当てられ、次に BitmapFactory-class の呼び出しにより 18 回割り当てられます。どうして???

ビットマップを縮小するメソッドを以下に投稿します。コードをより適切に記述できますか? 9枚の画像に対してリソースが27回割り当てられるのは理にかなっていますか? たとえば、BitmapFactory.decodeResource を何度も呼び出していますか? しかし、私は一度しかリサイクルできませんでした。

以下の重要なメソッドは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