2012-05-24 19 views
6

Mi aplicación tiene este fragmento de códigoCómo evitar el puntero nulo en View.getDrawingCache()?

mView.setDrawingCacheEnabled(true); 
mBitmap = Bitmap.createBitmap(mView.getDrawingCache()); 

Dónde mView es una instancia de una subclase personalizada de FrameLayout. La aplicación ha funcionado bien durante 6 meses con miles de usuarios. Recientemente recibí pocos informes (posiblemente del mismo usuario, pero no puedo confirmar) sobre un puntero nulo pasado a createBitmap(). No sé qué hardware o versión de Android usa el usuario.

¿Qué puede hacer que getDrawingCache() devuelva nulo a pesar de que habilité la memoria caché justo antes? ¿Está relacionado con la aceleración de hardware en teléfonos nuevos? ¿Es debido a la ram insuficiente para el mapa de bits? ¿Algo más? ¿Se puede prevenir?

Editar: Encontré esta solución aquí http://tinyurl.com/7yranvj. ¿Es una solución razonable?

mBitmap = Bitmap.createBitmap(mView.getWidth(), mView.getHeight(), 
     Bitmap.Config.ARGB_8888); 
final Canvas canvas = new Canvas(mBitMap); 
mView.draw(canvas); 

Respuesta

0

En realidad su conjetura era correcta. Si está utilizando capa acelerada por hardware, no puede usar la memoria caché de dibujo. Los dispositivos nuevos tienen aceleración de hardware activada de manera predeterminada, por lo que podría ser su problema. puede desactivar la aceleración de hardware para una sola vista como esta.

if(android.os.Build.VERSION.SDK_INT >= 11) frame.setLayerType(LAYER_TYPE_SOFTWARE, null); 
frame.setDrawingCacheEnabled(true); 
Cuestiones relacionadas