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一个应用程序。Android 兼容性定义文档 (CDD),第 3.7 节。虚拟机兼容性为各种屏幕尺寸和密度提供所需的最低应用程序内存。应优化应用程序以在此最小内存限制下执行。但是,请记住,许多设备都配置了更高的限制。

位图占用大量内存,尤其是对于照片等丰富的图像。例如,Galaxy Nexus 上的相机可拍摄高达 2592x1936 像素(5 兆像素)的照片。如果使用的位图配置是 ARGB_8888(Android 2.3 以后的默认配置),则将此图像加载到内存中大约需要 19MB 内存(2592*1936*4 字节),会立即耗尽某些设备的每个应用程序的限制。

尝试在此链接中阅读Android 开发人员

于 2012-10-29T05:10:27.563 回答