9

Según Desarrolladores de Android sitio, la definición Bitmap.recycle() método es:¿Cuándo (si es el caso) debo usar Bitmap.recycle()?

gratuito el objeto nativo asociado con este mapa de bits, y borrar la referencia a los datos de píxeles

he desarrollado algunos aplicaciones que crean/descodifican una gran cantidad de mapas de bits y colocan los objetos de mapa de bits resultantes en ImageView s. A veces tengo las famosas excepciones tales como: tamaño excceded

mapa de bits presupuesto vm

y

error de memoria

También estoy seguro de No tengo ninguna pérdida de memoria que pueda causar eso.

Después de muchas búsquedas, descubrí el método de "reciclaje" y lo usé para liberar la memoria nativa del mapa de bits cuando ya no la necesitaba. Parece que ayudó mucho.

Estoy preguntando si eso es algo que se supone que debo hacer en esta situación, porque Sé que el sistema está haciendo esto de todos modos sin llamarlo explícitamente (¿es? Tal vez estoy equivocado).

¿Debo usar este método en situaciones como esta?

¿En qué situaciones debo usar este método?

¿Debo usar este método?

gracias de antemano.

ACTUALIZACIÓN:

Google publicó recientemente this guía, que dice: se recomienda

En Android 2.3.3 (API nivel 10) e inferior, utilizando de reciclaje(). Si muestra grandes cantidades de datos de mapa de bits en su aplicación, es probable que se encuentre con errores OutOfMemoryError. El método recycle() permite que una aplicación recupere memoria lo antes posible.

+5

No es necesario llamar 'recyle'. Puede ser útil, pero solo cuando lo estás usando correctamente. En realidad es mucho más fácil hacer una 'WeakReference' a su objeto' Bitmap' y devolverlo en su lugar. [Deberías ver esta charla de Google IO] (http://www.youtube.com/watch?v=_CruQY55HOk) – adneal

+0

@aneal: gracias, ya he visto ese video hace mucho tiempo. –

Respuesta

3

¿En qué situaciones debo usar este método?

Bitmaps es GC'ed by GC cuando lo decida. Pero en algunas situaciones puede retrasarse. Y recuerde siempre la regla de pulgar en java (Tal vez se aplique a otros P.L también). La velocidad de reciclado de objetos por GC puede no ser la misma que la velocidad de creación de objetos. Por lo tanto, el GC tarda en reciclarse.

así reciclar() significa que si desea liberar memoria ASAP debe llamar a reciclar()

debo utilizar este método en absoluto ??

Ésta es una llamada de avanzada, y normalmente no tiene por qué ser llamado, ya que el proceso de GC normal liberar esta memoria cuando ya no hay más referencias a este bitmap.But si se enfrentan a los problemas como el tamaño de mapa de bits excedió el presupuesto de vm o error de memoria luego debe usar esto.

0

Lo uso en operaciones donde sé que el mapa de bits ya no se va a utilizar.

public static Bitmap getMaskedContactImage (Context context, Bitmap contactImageBitmap, int maskToBeApplied) { 
    Bitmap mask = BitmapFactory.decodeResource(context.getResources(), maskToBeApplied); 
    Bitmap output = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Config.ARGB_8888); 
    final Rect finalRect = new Rect(0, 0, contactImageBitmap.getWidth(), contactImageBitmap.getHeight()); 
    final Rect originRect = new Rect(0, 0, mask.getWidth(), mask.getHeight()); 
    Canvas canvas = new Canvas(output); 

    Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    xferPaint.setColor(Color.BLACK); 

    xferPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

    canvas.drawBitmap(contactImageBitmap, finalRect, originRect, null); 
    canvas.drawBitmap(mask, originRect, originRect, xferPaint); 

    contactImageBitmap.recycle(); 
    mask.recycle(); 

    return output; 
    } 

En lugares como ese, estoy seguro de que no voy a utilizar la máscara o la imagen de contacto.

Encontré un muy buen recurso para el procesamiento de mapa de bits que puede ser útil Displaying bitmaps.

Saludos, Alex

Cuestiones relacionadas