2011-08-18 19 views
5

Sto lavorando con il widget Galleria e un sacco di bitmap. Per cancellare bitmap uso Bitmap.recycle(). Come risultato vedo sul logcat prossimo messsage:Messaggio Android "Impossibile generare texture da bitmap"

08-18 17:49:26.020: INFO/dalvikvm-heap(13847): Grow heap (frag case) to 22.373MB for 2457616-byte allocation 
08-18 17:49:26.060: DEBUG/dalvikvm(13847): GC_FOR_ALLOC freed 1K, 36% free 22835K/35143K, paused 27ms 
08-18 17:49:26.230: DEBUG/dalvikvm(13847): GC_CONCURRENT freed <1K, 36% free 22835K/35143K, paused 2ms+3ms 
08-18 17:49:28.070: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.080: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.110: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.120: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.140: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.160: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.180: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.190: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.210: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.230: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.240: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.260: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.280: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.290: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.310: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.330: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.350: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.360: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.380: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.400: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.410: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.430: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.450: ERROR/OpenGLRenderer(13847): Cannot generate texture from bitmap 
08-18 17:49:28.500: INFO/System.out(13847): Image width: 144; height: 108 
08-18 17:49:28.570: DEBUG/dalvikvm(13847): GC_FOR_ALLOC freed 4094K, 42% free 20449K/35143K, paused 27ms 
08-18 17:49:28.620: INFO/dalvikvm-heap(13847): Grow heap (frag case) to 22.385MB for 2457616-byte allocation 

E voce su Gallery-widget è nero. Ma l'applicazione funziona.

Avete qualche idea per questa domanda?

risposta

13

Ho appena avuto lo stesso problema. Il fatto è che chiamando recycle() si distrugge l'oggetto nativo facendo riferimento ai dati pixel dell'immagine e l'oggetto stesso (bitmap) è contrassegnato come "morto". Se non ci sono altri oggetti che fanno riferimento a tali dati, questi verranno liberati da GC. Quindi ti stanno succedendo due cose:

  1. i bitmap vengono semplicemente raccolti da GC in modo che il renderer non abbia dati da utilizzare.
  2. come bitmap si è contrassegnato morti non si può leggere/scrivere pixel da/ad esso

Quindi, se si sta utilizzando/riferimento a questo bitmap e riciclarlo, semplicemente negare l'accesso a esso per tutti. Almeno lo capisco in questo modo. Leggere attentamente:

http://developer.android.com/reference/android/graphics/Bitmap.html#recycle%28%29

così si dovrebbe usare ricicla solo se siete sicuri che nessuno sta usando/riferimento all'oggetto bitmap. Spero possa essere d'aiuto.

+0

Stavo riciclando l'istanza bitmap in un asynctask dopo che ho impostato il disegnabile su una vista di immagini e stavo notando questi errori. Ho risolto il problema non riciclando la bitmap. Un sintomo di sapere se stai riciclando() troppo presto è che la tua visualizzazione di immagini renderà i pixel neri invece dell'immagine reale che rappresenta fondamentalmente i pixel morti (o i pixel non disponibili). – praneetloke

+0

Grazie mille !! – swiftBoy

0

Come speedy said, si sta probabilmente tentando di accedere a bitmap che sono state contrassegnate per Garbage Collection.

Una soluzione semplice per questo è di fare un controllo isRecycled() prima di restituire un bitmap:

// ... 

/** 
* Will return a usable Bitmap or null if the Bitmap was not found. 
*/ 
public Bitmap getBitmapForGallery(int uniqueImageId) 
{ 
    Bitmap bitmap; 

    // The code to fetch bitmap from cache is here. 
    // ... 

    return bitmap.isRecycled() ? null : bitmap; 
} 

// ... 
0

Ciò si verifica anche quando si riutilizza un bitmap

Eg.bitmap = getResizedBitmap (bitmap, 500); Qui ho usato di nuovo bitmap per ridimensionarlo, il che ha causato un problema.

Problemi correlati