Сбой транзакции связывания при динамическом размещении растрового изображения в виджете - PullRequest
115 голосов
/ 20 августа 2010

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

Ответы [ 6 ]

90 голосов
/ 31 декабря 2011

Это вызвано тем, что все изменения в RemoteViews сериализуются (например, 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 для каждого квадратаэто должно взять на экране) и использовать его для вашего виджета, и ваша проблема будет решена:)

62 голосов
/ 28 августа 2013

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

Сжать !!

        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);
37 голосов
/ 23 апреля 2012

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

см. Ссылку

12 голосов
/ 06 декабря 2014

См. Мой ответ в этой ветке.

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

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

8 голосов
/ 30 мая 2013

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

3 голосов
/ 16 сентября 2013

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

...