由于失败的 Binder 事务,Appwidget 无法更新

Posted

技术标签:

【中文标题】由于失败的 Binder 事务,Appwidget 无法更新【英文标题】:Appwidget can't update because of Failed Binder transaction 【发布时间】:2012-12-06 17:48:09 【问题描述】:

当我第一次在屏幕上添加小部件时,它可以正常工作,然后当我单击小部件上的按钮进入活动并关闭它时。小部件停止更新并显示此错误

12-19 19:14:52.370: E/JavaBinder(14805): !!! FAILED BINDER TRANSACTION !!!

这是我的代码:

Widget4x2.remoteViews.setProgressBar(R.id.widget_progressbar, 100, (int)(NowPlayingService.progress * 100), false);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(Widget4x2.context);
appWidgetManager.updateAppWidget(new ComponentName(Widget4x2.context,Widget4x2.class), Widget4x2.remoteViews);

代码有问题吗?

【问题讨论】:

【参考方案1】:

我猜 Widget4x2.remoteViews 是一个静态变量。可能是静态变量没有赋值,或者没有正确启动。

【讨论】:

【参考方案2】:

当您在 RemoteViews 上调用 setter(如 setProgressBar)时,它不会直接更改视图。相反,它存储这些 chages 的序列(称为操作)并将它们序列化以将它们发送到通知或小部件管理器。

当您使用静态变量来存储 RemoteViews 对象时,与 remoteViews 关联的操作列表会随着您更新 remoteViews 而无限增长。当序列化的remoteViews 的大小达到 1Mb 时,这将停止,这是 binder 事务的最大有效负载大小。

没有办法清除或删除操作列表,因此重新创建RemoteViews 是一种解决方案。

【讨论】:

以上是关于由于失败的 Binder 事务,Appwidget 无法更新的主要内容,如果未能解决你的问题,请参考以下文章

javabinder,失败的 BINDER 事务 - setImageViewBitmap(..) [重复]

失败的 Binder 事务文本文件

更新大量小部件位图时避免 FAILED BINDER TRANSACTION 错误

如何获取 Binder 事务缓冲区的内容以进行故障排除

AppWidget(桌面小部件)

AppWidget(桌面小部件)