Предотвращение ошибки транзакции сбоя BINDER при обновлении большого количества растровых изображений виджетов - PullRequest
9 голосов
/ 01 августа 2011

При обновлении моих RemoteViews в моем AppWidget возникает ошибка.

.. !!!СДЕЛКА СБОЙ БИНДЕРА !!!

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

Я не могу использовать setImageResource, поскольку я надеюсь позволить пользователю загружать скины для виджета.

Кто-нибудь может порекомендовать обходной путь для этой проблемы?Я уже использую «новый» объект RemoteViews для каждого экземпляра виджета, но один экземпляр содержит слишком много обновлений.

Спасибо!

Ответы [ 4 ]

10 голосов
/ 02 августа 2011

Лучшее решение, которое я нашел, было использование setImageURI для ImageView объектов с использованием

remoteViews.setUri(R.id.myImageView, "setImageURI", "file://blahblahblah.png");

Вот полное обсуждение группы разработчиков Android

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

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

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 голос
/ 20 июня 2012

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

см. Ссылку

0 голосов
/ 02 марта 2012

Я попробовал файловый подход URI, перечисленный выше и другие места. Это работало, но имело два недостатка: сначала потребовалось 500 мс, чтобы написать файл, который был заметен в моем приложении. Во-вторых, ImageView уменьшил изображение по плотности () (1,5 на Nexus S).

Решение, которое сработало для меня лучше, - это разрезать изображение и обновлять каждый срез отдельно. Макет выглядит как

<LinearLayout orientation=vertical ...>
    <ImageView id = slice1, ,,,>
    ...
    <ImageView id = slice4, ,,,>
</LinearLayout>

Затем в поставщике виджетов разрезать растровое изображение на 4 фрагмента и обновить каждый отдельно (каждый со своим на RemoteViews и своим собственным appWidgetManager.updateAppWidget (...). Извините за описание высокого уровня, но, надеюсь, вы поняли идею .

...