由于失败的 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(..) [重复]