Не вдалося здійснити транзакцію зв’язування під час динамічного розміщення растрової карти у віджеті


116

Чи може хто-небудь сказати мені причину помилки транзакційної помилки транзакції ? Я бачу це повідомлення про помилку в logcat. Я отримую цю помилку, намагаючись динамічно поставити растрову карту у віджет ...

Відповіді:


91

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


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

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
Ідеально, це значно зменшує розмір растрових зображень.
Навін

1
чому б не використовувати JPEG замість PNG? хіба це не краще стиснути?
mehmet6parmak

3
@ mehmet6parmak Використовується PNG, оскільки він без втрат, на відміну від JPEG. Так, JPEG стискається краще, але в результаті якість (дещо) погіршується.
Петцко

не працює для мене :( stackoverflow.com/questions/34540819/…
Джон Джо

Кудо! Чудове вирішення тимчасової реалізації, над якою я працював. Хоча під час використання пакетів / намірів слід уникати передачі важких даних.
sud007

37

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

перейдіть за цим посиланням


12

Дивіться мою відповідь у цій темі.

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

Ви перевищуєте буфер транзакцій в'яжучого шляхом перенесення великих елементів (елементів) з однієї діяльності на іншу.


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

8

Я вирішив цю проблему, зберігаючи зображення у внутрішній пам’яті та використовуючи .setImageURI (), а не .setBitmap ().


1
і не передавайте зображення через Parcelable з екрана на екран чи так, я думаю, що це найгірше в цьому випадку
MartinC

3

Правильний підхід полягає у використанні setImageViewUri()(повільніше) або setImageViewBitmap()відтворенні RemoteViews кожного разу, коли ви оновлюєте сповіщення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.