createBitmap () приводит меня в java.lang.OutOfMemoryError - PullRequest
0 голосов
/ 27 марта 2012

Я пытаюсь вращать 3 изображения (или лучше растровые изображения за ними) каждые 10-100 мс.я делаю вращение так:

ImageView ivLoad;
Bitmap bMapLoad;

....

Matrix mat=new Matrix();
mat.reset();
mat.postScale(1.55f, 1.55f);
mat.postRotate((float)currentLoadDegree+(float)LoadDegree);
bMapLoad = Bitmap.createBitmap(bMapLoadgr, 0, 0, bMapLoadgr.getWidth(), bMapLoadgr.getHeight(), mat, true);
ivLoad.setImageBitmap(bMapLoad);
ivLoad.setScaleType(ScaleType.CENTER);

....

при первом запуске приложения все работает нормально.второй раз также работает, но в третий раз, когда я запускаю приложение, оно вылетает со следующей ошибкой:

03-27 10:01:09.234: E/AndroidRuntime(3603): java.lang.OutOfMemoryError
03-27 10:01:09.234: E/AndroidRuntime(3603):     at android.graphics.Bitmap.nativeCreate(Native Method)    
03-27 10:01:09.234: E/AndroidRuntime(3603):     at android.graphics.Bitmap.createBitmap(Bitmap.java:605)  
03-27 10:01:09.234: E/AndroidRuntime(3603):     at android.graphics.Bitmap.createBitmap(Bitmap.java:551)

после долгой попытки я обнаружил, что когда я вызываю System.exit (0) в onDestroyметод все работает.теперь я не знаю, будет ли лучший способ, потому что в Google многие люди означают, что System.exit (0) небезопасен.

, поэтому у меня возникнут проблемы с этим?

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Вместо поворота растрового изображения вы можете вращать холст, на котором рисуете.

canvas.save();
canvas.translate(-canvasWidth/2, -canvasHeight/2);
canvas.rotate(degrees)

canvas.drawBitmap( ... )

canvas.translate(-canvasWidth/2, -canvasHeight/2);
canvas.restore();

Теперь вы получаете новое растровое изображение только тогда, когда само изображение обновляется, даже если вы можете поворачивать его так часто, как вам нравится. Но если вы получаете новое растровое изображение, вам все равно нужно вызвать Bitmap.recycle() на старом.

1 голос
/ 27 марта 2012

Вы не должны воссоздавать растровое изображение на каждом шаге вращения, вместо этого вы должны просто попытаться нарисовать его повернутым. Это также возможно с матрицей (то, что вы уже используете) и позволит избежать чрезмерного использования памяти.

Android: как повернуть растровое изображение в центральной точке

0 голосов
/ 27 марта 2012

Вы получаете OutOfMemoryError, потому что вы загружаете Bitmap каждый раз, когда вы поворачиваете ImageView. Вы должны рассмотреть возможность повторного использования уже загруженного растрового изображения. Также вызовите метод Bitmap.recycle(), когда вам больше не нужен растровый рисунок.

...