El mapa de bits rotativo hace que outOfMemoryException

Estoy rotando un mapa de bits de esta manera, en cada clic de botón la imagen gira 90 grados

Matrix matrix = new Matrix(); matrix.postRotate(90); rotated = Bitmap.createBitmap(rotated, 0, 0, rotated.getWidth(), rotated.getHeight(), matrix, true); iv.setImageBitmap(rotated); 

He intentado esto con un montón de imágenes, pero ahora uno causó un OutOfMemoryError. ¿Hay alguna manera de evitar esto? Por supuesto puedo llamar a reciclar, pero luego pierdo el mapa de bits y tengo que volver a obtenerlo desde la vista de la imagen. No creo que eso haga ninguna diferencia.

Tengo sugerencias para usted.

1) Cuando usted tiene cualquier tarea de hambre de memoria, use en métodos y si es posible con AsyncTask .
2) Declare objetos como WeakReference . Esto le dará la oportunidad de liberar la memoria después del uso. Véase el ejemplo a continuación.

 public class RotateTask extends AsyncTask<Void, Void, Bitmap> { private WeakReference<ImageView> imgInputView; private WeakReference<Bitmap> rotateBitmap; public RotateTask(ImageView imgInputView){ this.imgInputView = new WeakReference<ImageView>(imgInputView); } @Override protected void onPreExecute() { //if you want to show progress dialog } @Override protected Bitmap doInBackground(Void... params) { Matrix matrix = new Matrix(); matrix.postRotate(90); rotateBitmap = new WeakReference<Bitmap>(Bitmap.createBitmap(rotated, 0, 0,rotated.getWidth(), rotated.getHeight(), matrix, true)); return rotateBitmap.get(); } @Override protected void onPostExecute(Bitmap result) { //dismiss progress dialog imgInputView.get().setImageBitmap(result); } } 

Esta tarea tiene todas las vistas y el objeto como WeakReference . Cuando se completa esta tarea, toda la memoria utilizada por esta tarea es gratuita. Pruebe este enfoque. Utilicé en mi aplicación.

Prueba como abajo:

 Matrix matrix = new Matrix(); matrix.postRotate(90); rotated = Bitmap.createBitmap(rotated, 0, 0,rotated.getWidth(), rotated.getHeight(), matrix, true); ByteArrayOutputStream bmpStream = new ByteArrayOutputStream(); rotated.compress(Bitmap.CompressFormat.JPEG,100, bmpStream); iv.setImageBitmap(rotated); 

Si sólo necesita ver las imágenes, puede establecer una rotación dibujable como se muestra aquí

Si te interesa la rotación real del mapa de bits, y también quieres evitar el OOM, mira este enlace

  • El tamaño del mapa de bits supera el error de presupuesto de Vm android
  • Java.lang.OutOfMemoryError Incluso en un bloque try-catch?
  • OutOfMemoryError: el tamaño de mapa de bits supera el presupuesto de VM: - Android
  • Java.lang.outofmemoryerror android.graphics.BitmapFactory.nativeDecodeAsset (Método nativo)
  • BitmapFactory.decodeStream falta de memoria a pesar de usar tamaño de muestra reducido
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.