Czy ktoś może mi podać przyczynę nieudanej transakcji bindera? Widzę ten komunikat o błędzie w logcat. Otrzymuję ten błąd podczas próby dynamicznego umieszczenia mapy bitowej w widżecie ...
116
Jest to spowodowane tym, że wszystkie zmiany w RemoteViews są serializowane (np. SetInt i setImageViewBitmap). Mapy bitowe są również serializowane do pakietu wewnętrznego. Niestety ten pakiet ma bardzo mały limit rozmiaru.
Możesz rozwiązać ten problem, zmniejszając 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, aby był wystarczająco mały (~ 100 na każdy kwadrat, jaki powinien zająć na ekranie) i użyj go jako widgetu, a problem zostanie rozwiązany :)
Możesz skompresować bitmapę jako tablicę bajtów, a następnie zdekompresować ją w innym działaniu, takim jak to.
Kompresja!!
Rozpakuj !!
źródło
Bufor transakcji Binder ma ograniczony stały rozmiar, obecnie 1 MB, który jest współdzielony przez wszystkie transakcje w toku procesu. W konsekwencji ten wyjątek może zostać zgłoszony, gdy istnieje wiele transakcji w toku, nawet jeśli większość pojedynczych transakcji ma umiarkowany rozmiar.
skieruj ten link
źródło
Zobacz moją odpowiedź w tym wątku.
intent.putExtra("Some string",very_large_obj_for_binder_buffer);
Przekraczasz bufor transakcji segregatora, przenosząc duże elementy z jednego działania do drugiego.
źródło
Rozwiązałem ten problem, przechowując obrazy w pamięci wewnętrznej, a następnie używając .setImageURI () zamiast .setBitmap ().
źródło
Właściwym podejściem jest użycie
setImageViewUri()
(wolniej) lubsetImageViewBitmap()
i ponowne utworzenieRemoteView
s za każdym razem, gdy aktualizujesz powiadomienie.źródło