1

リフレクトでドローアブルを作成しようとしています。これが私のコードです:

public Drawable createReflectedImage(Drawable d) {

    int width = d.getIntrinsicWidth();
    int height = d.getIntrinsicHeight();
    Bitmap originalImage = Bitmap.createBitmap(width, height,
            Config.ARGB_8888);
    d.setBounds(0, 0, width, height);
    Canvas canvas = new Canvas(originalImage);
    d.draw(canvas);

    final int reflectionGap = 4;

    Matrix matrix = new Matrix();
    matrix.preScale(1, -1);

    Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
            height / 2, width, height / 2, matrix, false);

    Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
            (height + height / 2), Config.ARGB_8888);

    canvas = new Canvas(bitmapWithReflection);

    canvas.drawBitmap(originalImage, 0, 0, null);

    Paint deafaultPaint = new Paint();
    canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);

    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

    Paint paint = new Paint();
    LinearGradient shader = new LinearGradient(0,
            originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
                    + reflectionGap, 0x70ffffff, 0x00ffffff,
            TileMode.MIRROR);

    paint.setShader(shader);

    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
            + reflectionGap, paint);
    BitmapDrawable drawable = new BitmapDrawable(getContext()
            .getResources(), bitmapWithReflection);
    originalImage.recycle();
    reflectionImage.recycle();
    return drawable;
}

createReflectedImageこの関数の最後に null を返すだけでも、呼び出されるたびに次のログが表示されました。

10-29 10:56:48.541: I/dalvikvm-heap(23989): Grow heap (frag case) to 19.332MB for 960016-byte allocation

このメモリリークがどのように発生したかを理解してくれる人はいますか?

4

2 に答える 2

2

これはメモリリークではありません。すべてのAndroidデバイスには、アプリケーションごとの最大ヒープサイズがあります。パフォーマンス上の理由から、Androidはそのサイズをすべてのアプリケーションに割り当てるのではなく、アプリがより多くのメモリを必要とするまで待機して割り当てます。表示されるこのメッセージは、アプリがメモリを要求したときにDVMがより多くのメモリを割り当てていることであり、完全に正常です。

メモリリークの間、GCが頻繁に起動するのがわかります。これは、logcatのメッセージでヒントを与える可能性があります。

于 2012-10-29T03:15:29.977 に答える
0

これはグーグルによって言われていることです:

通常、モバイル デバイスのシステム リソースには制約があります。Android デバイスは16MB of memory available、アプリケーションを 1 つしか持つことができません。Android 互換性定義ドキュメント (CDD)、セクション 3.7。仮想マシンの互換性により、さまざまな画面サイズと密度に必要な最小限のアプリケーション メモリが提供されます。アプリケーションは、この最小メモリ制限内で実行できるように最適化する必要があります。ただし、多くのデバイスがより高い制限で構成されていることに注意してください。

ビットマップは、特に写真のようなリッチ イメージの場合、大量のメモリを消費します。たとえば、Galaxy Nexus のカメラは、最大 2592x1936 ピクセル (5 メガピクセル) の写真を撮影します。使用されるビットマップ構成が ARGB_8888 (Android 2.3 以降のデフォルト) の場合、このイメージをメモリにロードすると、約 19MB のメモリ (2592*1936*4 バイト) が必要になり、一部のデバイスではアプリごとの制限をすぐに使い果たします。

このリンクを読んでみてくださいAndroid開発者

于 2012-10-29T05:10:27.563 に答える