加载位图后释放内存

时间:2015-05-01 19:32:11

标签: android memory bitmap

在我的应用程序中,我放了两个位图。当方向垂直时,显示第一个图像,如果它是水平的,则显示第二个图像。使用

Log.i("log","Total memory " + title + " = " + (int) (Runtime.getRuntime().totalMemory()/1024));

我发现在我改变手机的方向几次后,总内存增长。但是,我希望内存保持不变,似乎程序没有正确释放内存。

这是我的代码

public  Bitmap decodeSampledBitmapFromResource(int path, int reqWidth, int reqHeight, Context ctx){
    // Читаем с inJustDecodeBounds=true для определения размеров
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap b = BitmapFactory.decodeResource(ctx.getResources(), path, options);

    // Вычисляем inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);

    // Читаем с использованием inSampleSize коэффициента
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(ctx.getResources(), path, options);
}

public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth, int reqHeight) {
    // Реальные размеры изображения
    Log.i("log", "inSampleSize" + reqWidth);
    Log.i("log", "inSampleSize" + reqHeight);
    final int height = options.outHeight;
    Log.i("log", "height" + height);
    final int width = options.outWidth;
    Log.i("log", "height" + width);
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Вычисляем наибольший inSampleSize, который будет кратным двум
        // и оставит полученные размеры больше, чем требуемые
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
            Log.i("log", "inSampleSize" + inSampleSize);
        }
    }

    return inSampleSize;
}

private void readImage(int draw) {

    //int px = getResources().getDimensionPixelSize(draw);
    int pxW = displaymetrics.widthPixels;
    int pxH = displaymetrics.heightPixels;
    ***if(bitmap != null){
        bitmap.recycle();
        bitmap = null;
    }***

    bitmap = decodeSampledBitmapFromResource(draw, My_px_W, My_px_H, this);
    ivStart.setImageBitmap(bitmap);

}

这里是onCreate

 if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

        My_px_W = 200;
        My_px_H = 150;

        readImage(R.drawable.im2);



        logMemory("'vertical'");
    }
    else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

        My_px_W = 400;
        My_px_H = 200;

        readImage(R.drawable.s2);
        logMemory("'horizontal'");

    }

2 个答案:

答案 0 :(得分:1)

如果您希望立即释放System.gc(),则需要致电recycle

回收它本身是不够的,因为没有调用垃圾收集器。

  

释放与此位图关联的本机对象,然后清除   参考像素数据。这不会释放像素数据   同步;它只是允许它被垃圾收集,如果有的话   没有其他参考。位图标记为“死”,意思是它   如果调用getPixels()或setPixels(),则会抛出异常   什么都不会。这个操作无法逆转,所以应该如此   只有在你确定没有进一步的用途时才被调用   位图。这是一个高级调用,通常不需要调用,   因为正常的GC过程会在没有时释放这个内存   更多对此位图的引用。

答案 1 :(得分:0)

您应致电$studentsQuery = $core->query("SELECT * FROM ".TP."students"); ,然后致电bitmap.recycle()

请确保在调用recycle()

之后您没有使用相同的位图