在我的应用程序中,我放了两个位图。当方向垂直时,显示第一个图像,如果它是水平的,则显示第二个图像。使用
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'");
}
答案 0 :(得分:1)
如果您希望立即释放System.gc()
,则需要致电recycle
。
回收它本身是不够的,因为没有调用垃圾收集器。
释放与此位图关联的本机对象,然后清除 参考像素数据。这不会释放像素数据 同步;它只是允许它被垃圾收集,如果有的话 没有其他参考。位图标记为“死”,意思是它 如果调用getPixels()或setPixels(),则会抛出异常 什么都不会。这个操作无法逆转,所以应该如此 只有在你确定没有进一步的用途时才被调用 位图。这是一个高级调用,通常不需要调用, 因为正常的GC过程会在没有时释放这个内存 更多对此位图的引用。
答案 1 :(得分:0)
您应致电$studentsQuery = $core->query("SELECT * FROM ".TP."students");
,然后致电bitmap.recycle()
请确保在调用recycle()
之后您没有使用相同的位图