Неудачная транзакция связывания при динамическом размещении растрового изображения в виджете


116

Может ли кто-нибудь сказать мне причину неудачной ошибки транзакции связующего ? Я вижу это сообщение об ошибке в logcat. Я получаю эту ошибку при попытке динамически разместить растровое изображение в виджете ...

Ответы:


91

Это вызвано тем, что все изменения в RemoteView сериализованы (например, setInt и setImageViewBitmap). Растровые изображения также сериализуются во внутренний пакет. К сожалению, у этого пакета очень маленький размер.

Вы можете решить эту проблему, уменьшив размер изображения следующим образом:

 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;
 }

Выберите newHeight достаточно маленьким (~ 100 на каждый квадрат, который он должен занимать на экране) и используйте его для своего виджета, и ваша проблема будет решена :)


1
Я не совсем понимаю, что именно здесь происходит. Я использую ViewPager с довольно большим набором данных, но он запоминает все между страницами, несмотря на спам с ошибками связующего. Пакет записывается в локальное хранилище, а затем предварительно загружается или как? Могу ли я потерять данные, если добавлю больше страниц?
G_V 03

7
Но это снизит качество изображения
Джон Джо

64

Вы можете сжать растровое изображение как массив байтов, а затем распаковать его в другом действии, например здесь.

Компресс!!

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

Распаковка !!

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

1
Отлично, это значительно уменьшает размер растрового изображения.
Navin

1
почему бы не использовать JPEG вместо PNG? не лучше ли сжать?
mehmet6parmak 06

3
@ mehmet6parmak PNG используется потому, что в отличие от JPEG, он не содержит потерь. Да, JPEG лучше сжимается, но в результате страдает качество (несколько).
Petzku

у меня не работает :( stackoverflow.com/questions/34540819/…
Джон Джо

Престижность! Отличный обходной путь для временной реализации, над которой я работал. Хотя следует избегать передачи тяжелых данных при использовании Bundles / Intents.
sud007

37

Буфер транзакции Binder имеет ограниченный фиксированный размер, в настоящее время 1 МБ, который используется всеми транзакциями, выполняемыми для процесса. Следовательно, это исключение может быть вызвано, когда выполняется много транзакций, даже если большинство отдельных транзакций имеют средний размер.

обратитесь по этой ссылке


12

Смотрите мой ответ в этой теме.

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

Вы превышаете буфер транзакции связующего из-за переноса больших элементов из одного действия в другое.


У меня была такая же проблема, я просто удалил проблему putExtra, отсортированную!
Ivor

8

Я решил эту проблему, сохранив изображения во внутреннем хранилище, а затем используя .setImageURI (), а не .setBitmap ().


1
и не передавайте изображения через Parcelable с экрана на экран или около того, я думаю, что в этом случае
хуже всего

3

Правильный подход - использовать setImageViewUri()(медленнее) или setImageViewBitmap()и воссоздавать RemoteViewкаждый раз, когда вы обновляете уведомление.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.