2012-05-24 11 views
6

mia app ha questo frammento di codiceCome evitare il puntatore nullo in View.getDrawingCache()?

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

Dove MView è un'istanza di una sottoclasse personalizzata di FrameLayout. L'app ha funzionato bene per 6 mesi con migliaia di utenti. Recentemente ho ricevuto pochi report (probabilmente dallo stesso utente ma non posso confermare) su un puntatore nullo passato a createBitmap(). Non so quale hardware o versione di Android l'utente utilizza.

Cosa può causare a getDrawingCache() di restituire null anche se ho abilitato la cache subito prima? È legato all'accelerazione hardware nei nuovi telefoni? È a causa della RAM insufficiente per la bitmap? Qualunque altra cosa? Può essere prevenuto?

Modifica: ho trovato questa soluzione qui http://tinyurl.com/7yranvj. È una soluzione ragionevole?

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

risposta

0

in realtà la tua ipotesi era giusta. Se si utilizza il livello accelerato hardware, non è possibile utilizzare la cache di disegno. I nuovi dispositivi hanno l'accelerazione hardware attivata per impostazione predefinita, quindi potrebbe essere il tuo problema. puoi disattivare l'accelerazione hardware per una singola visualizzazione come questa.

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