2010-08-20 12 views

risposta

87

Ciò è causato dal fatto che tutte le modifiche a RemoteViews sono serializzate (ad esempio setInt e setImageViewBitmap). Le bitmap sono anche serializzate in un pacchetto interno. Sfortunatamente questo bundle ha un limite di dimensioni molto ridotte.

È possibile risolverlo scalando verso il basso le dimensioni dell'immagine in questo modo:

public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) { 

final float densityMultiplier = context.getResources().getDisplayMetrics().density;   

int h= (int) (newHeight*densityMultiplier); 
int w= (int) (h * photo.getWidth()/((double) photo.getHeight())); 

photo=Bitmap.createScaledBitmap(photo, w, h, true); 

return photo; 
} 

Scegliere newheight essere abbastanza piccolo (~ 100 per ogni piazza che dovrebbe assumere sullo schermo) e usarlo per il tuo widget, e il problema verrà risolto :)

+1

Quello che non capisco è cosa succede esattamente qui. Sto usando un ViewPager con un set di dati abbastanza grande, ma ricorda tutto tra le pagine nonostante lo spam di binder. Il bundle viene scritto nella memoria locale e poi precaricato o cosa? Posso perdere i dati se aggiungo più pagine? –

+1

Grande aiuto. grazie mille !!!! – Jigar

+5

Ma questo ridurrà la qualità dell'immagine –

35

Il buffer di transazione di Binder ha una dimensione fissa limitata, attualmente 1Mb, che è condivisa da tutte le transazioni in corso per il processo. Di conseguenza, questa eccezione può essere generata quando ci sono molte transazioni in corso anche quando la maggior parte delle singole transazioni ha dimensioni moderate.

riferiscono questo link

8

ho risolto questo problema memorizzando le immagini nella memoria interna e quindi utilizzando .setImageURI() anziché .setBitmap().

+1

e non passare le immagini attraverso Parcelable da schermo a schermo o così, immagino che sia il peggiore in questo caso – MartinC

61

È possibile comprimere la bitmap come matrice di un byte e quindi decomprimerla in un'altra attività, come questa.

Comprimere !!

 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     byte[] bytes = stream.toByteArray(); 
     setresult.putExtra("BMP",bytes); 

Uncompress !!

 byte[] bytes = data.getByteArrayExtra("BMP"); 
     Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
+1

Perfetto, questo riduce significativamente le dimensioni della bitmap. – Navin

+1

perché non utilizzare JPEG anziché PNG? non è meglio compresso? – mehmet6parmak

+2

@ mehmet6parmak PNG viene utilizzato perché non ha perdite, a differenza di JPEG. Sì, il JPEG si comprime meglio, ma la qualità (un po ') soffre di conseguenza. – Petzku

3

L'approccio giusto è quello di utilizzare setImageViewUri() (più lento) o il setImageViewBitmap() e ricreare RemoteView s ogni volta che si aggiorna la notifica.

12

Vedere la risposta in this thread.

intent.putExtra("Some string",very_large_obj_for_binder_buffer);

di superamento del buffer di transazione legante trasferendo grande elemento (s) da un'attività all'altra attività.

+0

Ho avuto lo stesso problema che ho appena rimosso problema putExtra ordinato! – Ivor

Problemi correlati