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.
- Bitmap crear fuera de la memoria
- Error de memoria al cargar mapas de bits
- Error de OutOfMemory al unir imágenes grandes
- Android Drawable.createFromStream ha asignado demasiada memoria
- Diff b / w bitmap.recycle () y bitmap = nulo
- Android - Excepción de memoria
- Bitmap decodeStream OutOfMemory Excepción
- ¿Por qué tanta memoria?
- Google maps api v2 fuera de error de memoria
- ¿Cómo cargar imágenes grandes en Android y evitar el error de memoria?
- OutOfMemoryError en BitmapFactory.decodeFile ()
- Guardando una imagen grande en PNG
- Android: ¿Cómo resolver Bitmap java.lang.OutOfMemoryError?
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
- ¿Por qué mi barra de progreso no está centrada verticalmente?
- Appcompat, compatibilidad y bibliotecas de soporte para Lollipop si SDK mínimo = 14