Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Сжать!!

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

Ответ 3

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

ссылайтесь на эту ссылку

Ответ 4

Посмотрите мой ответ в этом нить.

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

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

Ответ 5

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

Ответ 6

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