Czy ktoś może mi powiedzieć, dlaczego wystąpił błąd nieudana transakcja wiążąca? Widzę ten komunikat o błędzie w logcat. Otrzymuję ten błąd podczas próby dynamicznego wstawiania mapy bitowej w widgecie ...Nieudana transakcja wiążąca podczas dynamicznego wstawiania mapy bitowej w widgecie
Odpowiedz
Jest to spowodowane tym, że wszystkie zmiany w widokach RemoteView są serializowane (np. SetInt i setImageViewBitmap). Bitmapy są również serializowane do wewnętrznego pakietu. Niestety ten pakiet ma bardzo mały rozmiar.
Można go rozwiązać poprzez skalowanie w dół rozmiar obrazu w ten sposób:
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;
}
Wybierz newHeight być na tyle małe (~ 100 za każdy kwadrat powinien wziąć na ekranie) i używać go do widgetu a twój problem zostanie rozwiązany :)
Bufor transakcji Binder ma ograniczony stały rozmiar, obecnie 1Mb, który jest wspólny dla wszystkich transakcji w toku dla procesu. W związku z tym wyjątek ten może zostać zgłoszony w przypadku wielu transakcji w toku, nawet jeśli większość pojedynczych transakcji ma umiarkowany rozmiar.
odnoszą ten link
Mam rozwiązać ten problem przez przechowywania zdjęć w pamięci wewnętrznej, a następnie za pomocą .setImageURI() zamiast .setBitmap().
i nie przesyłaj obrazów przez Parcelable z ekranu na ekran, tak czy inaczej, to chyba najgorsze w tym przypadku. – MartinC
Można skompresować bitmapę jako tablicę bajtów, a następnie rozpakować ją w innej czynności, na przykład.
Kompresuj !!
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] bytes = stream.toByteArray();
setresult.putExtra("BMP",bytes);
Rozpakuj !!
byte[] bytes = data.getByteArrayExtra("BMP");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Doskonały, to znacznie zmniejsza rozmiar bitmapy. – Navin
dlaczego nie używać JPEG zamiast PNG? czy nie jest lepiej skompresowany? – mehmet6parmak
@ mehmet6parmak PNG jest używany, ponieważ jest bezstratny, w przeciwieństwie do JPEG. Tak, JPEG kompresuje się lepiej, ale jakość (nieco) cierpi w rezultacie. – Petzku
Właściwym podejściem jest użycie setImageViewUri()
(wolniej) lub setImageViewBitmap()
i ponowne RemoteView
s za każdym razem dokonać aktualizacji zgłoszenia.
Nie bardzo rozumiem, co się tutaj dzieje. Używam ViewPagera z dość dużym zbiorem danych, ale pamięta on wszystko między stronami mimo spamu związanego z segregatorem. Czy pakiet jest zapisywany w pamięci lokalnej, a następnie zapisywany wstępnie lub co? Czy mogę utracić dane, jeśli dodaję więcej stron? –
Świetna pomoc. bardzo ci dziękuję !!!! – Jigar
Ale to zredukuje jakość obrazu –