appwidget冻结并拒绝更新:忽略updateAppWidget

所以我有一个很好的刷新的应用程序小部件,像发条一样定期将一个新的位图加载到ImageView 。 然后,在某个时刻,静静地,它将停止更新。 我可以从日志和从我的代码所查询的服务器上的活动中知道,这个小部件实际上仍然在继续定期onReceive()通过onReceive()捕获的广播,并且按照预期的方式执行它的东西。发生的事情是小部件内容不更新。

因此,在部件激发的代码中,我创build了一个新的RemoteViews并添加了一些东西,包括通过remoteViews.setImageViewBitmap(imageViewID, bmp)加载一个新的位图,最后调用appWidgetManager.updateAppWidget(appWidgetId, remoteViews)来更新小部件内容。 很好地工作…直到停止工作。

我不知道要发布什么代码,因为99%的时间都可以正常工作,但偶尔updateAppWidget()停止工作,没有明显的原因。 似乎这是一个系统问题,而不是我的代码中的错误,但我可能是错的。

似乎可能提示的唯一情况是当连接有变化,例如从无信号变为WiFi,可能频繁发生这样的变化。 在这种情况下似乎更多。

而一旦小部件冻结,解冻它唯一的东西是重新启动设备。 不重新启动,即使删除小部件,并添加一个新的不起作用。 事实上,添加一个新的会导致一个死的小部件,甚至没有响应点击来打开configuration活动,大概是因为remoteViews.setOnClickPendingIntent(R.id.widget, configPendingIntent)被忽略像在RemoteViews其他一切我仔细构build并发送到appWidgetManager.updateAppWidget()

这似乎与其他许多人所描述的一样:

https://code.google.com/p/android/issues/detail?id=28216

至今似乎还没有任何已知的治疗方法。 在https://code.google.com/p/android/issues/detail?id=28216#c56的post似乎提供了一些承诺,但我已经尝试在各个地方调用AppWidgetHost.startListening() ,包括常规间隔通过重复报警,看看我是否可以kickstart小部件,但似乎没有任何工作。

而其他用户(而不是开发人员)似乎也看到这个问题: http : //androidforums.com/threads/clock-widget-keeps-freezing-please-help.530333/

有任何想法吗? 这正在慢慢地让我发疯

Solutions Collecting From Web of "appwidget冻结并拒绝更新:忽略updateAppWidget"

 remoteViews.setImageViewBitmap(imageViewID, bmp) 

不要这样做。 这样做包裹位图并将整个事件作为绑定事务发送。 绑定器是为了传输less量的数据,而不是很好地处理位图。 即使小部件不断更新,它使用的系统资源也比需要的多,还有更多的启动资源(启动程序必须对位图进行不encryption的处理,至less暂时存储已包装的字节和未经过处理的字节,并且必须在UI线程上完成。但是你看到的问题是你链接的bug,有时候大的绑定器事务触发一个TransactionTooLargeException AppWidgetManagerService通过停止所有未来的更新(有时是所有的小部件,有时只是你的)来错误地处理这个问题。

相反,你应该使用setImageViewUri https://developer.android.com/reference/android/widget/RemoteViews.html#setImageViewUri(int,%20android.net.Uri) 。 这是一个更多的工作,因为你需要保存的位图,然后发送一个uri它,虽然目前所有或几乎所有的发射器都有READ_EXTERNAL_STORAGE所以一个file:/// uri外部存储可能工作,你不应该依靠在将来,而应该使用FileProvider https://developer.android.com/reference/android/support/v4/content/FileProvider.html