Qualcuno può indicarmi il motivo per l'errore transazione di binder? Posso vedere questo messaggio di errore in logcat. Viene visualizzato questo errore durante il tentativo di inserire dinamicamente un bitmap in un widget ...Transazione di binder non riuscita quando si inserisce dinamicamente un bitmap in un widget
risposta
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 :)
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
ho risolto questo problema memorizzando le immagini nella memoria interna e quindi utilizzando .setImageURI() anziché .setBitmap().
e non passare le immagini attraverso Parcelable da schermo a schermo o così, immagino che sia il peggiore in questo caso – MartinC
È 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);
Perfetto, questo riduce significativamente le dimensioni della bitmap. – Navin
perché non utilizzare JPEG anziché PNG? non è meglio compresso? – mehmet6parmak
@ 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
L'approccio giusto è quello di utilizzare setImageViewUri()
(più lento) o il setImageViewBitmap()
e ricreare RemoteView
s ogni volta che si aggiorna la notifica.
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à.
Ho avuto lo stesso problema che ho appena rimosso problema putExtra ordinato! – Ivor
- 1. Android java binder OPERAZIONE DI BINDER NON RIUSCITA?
- 2. schermata vuota dopo aver riavviato l'attività di avvio (transazione di binder non riuscita)
- 3. Aggiornamento di un albero di copertura minimo quando si inserisce
- 4. Impossibile eseguire l'operazione perché non c'è transazione corrente quando si inserisce nel database
- 5. SQLite Problema quando si inserisce un numero elevato di record
- 6. Come si inserisce un Func in un attributo C# (annotazione)?
- 7. Come si inserisce un file in un dispositivo in Django?
- 8. Sfuggire apice singolo in PHP quando si inserisce in MySQL
- 9. Come si inserisce un file fittizio in un repository git?
- 10. Quando un widget Qt ottiene un paintEvent?
- 11. Come allegare un bitmap quando si lancia ACTION_SEND intento
- 12. Come si inserisce un modello in un altro modello?
- 13. NullReferenceException quando si inserisce con Dapper
- 14. DB2 SQLCODE -668 quando si inserisce
- 15. Quando si inserisce un punto e virgola dopo un metodo di chiusura del rinforzo?
- 16. Operazione JDBC Rollback Spring quando non è in transazione
- 17. fare iscroll al lavoro quando si carica dinamicamente un div
- 18. Null quando si inserisce SpringSecurityService in Filter in Grails
- 19. Come si carica un file bitmap in un oggetto BitmapData?
- 20. Widget Android non si aggiorna
- 21. lxml non aggiunge newline quando si inserisce un nuovo elemento nel file xml esistente
- 22. Come si ottengono i figli di un widget in Qt?
- 23. Come evitare l'esaurimento della memoria quando si inserisce un milione di righe in mysql con php
- 24. ASP.NET inserisce dinamicamente il codice nella testa
- 25. Transazione di Raccoglitore fallita quando si restituisce l'immagine della telecamera
- 26. Formato PHP() quando si inserisce in datetime in MySQL
- 27. Compressione non riuscita quando si utilizza zip ionico
- 28. Come modificare lo sfondo di un widget genitore quando è attivo un widget figlio?
- 29. Come si inserisce un bordo attorno a un tag tr?
- 30. Come rilevare l'errore quando si inserisce un documento MongoDB che viola un indice univoco?
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? –
Grande aiuto. grazie mille !!!! – Jigar
Ma questo ridurrà la qualità dell'immagine –