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

drm*_*wer 10 android google-api remoteview appwidgetprovider android-appwidget

所以我有一个很好的刷新的app小部件,将一个新的位图加载到一个ImageView常规的发条中.然后,在某些时候,默默地,它会停止更新.我可以从日志和我的代码正在查询的服务器上的活动中看出,小部件实际上仍在继续定期触发(通过播放的广播onReceive(),并按预期执行其操作.唯一没有发生的事情是小部件内容没有更新.

因此,在小部件触发时执行的代码中,我正在创建一个新的RemoteView并向其添加内容,包括通过加载新的位图remoteViews.setImageViewBitmap(imageViewID, bmp),然后最终调用appWidgetManager.updateAppWidget(appWidgetId, remoteViews)以更新小部件内容.很好地工作......直到它停止工作.

我不确定要发布什么代码,因为99%的情况下这个东西工作得很好,但偶尔updateAppWidget()停止工作,没有明显的原因.似乎这是一个系统问题,而不是我的代码中的错误,但我可能是错的.

唯一似乎可能提示这一点的是当连接发生变化时,例如从无信号到WiFi,可能经常发生这种变化.在这些情况下似乎发生了更多.

一旦小部件冻结,唯一解冻它的是重启设备.如果不重新启动,即使删除小部件并添加新小部件也不起作用.实际上,添加一个新的小部件会导致死小部件甚至不响应单击以打开Config Activity,大概是因为remoteViews.setOnClickPendingIntent(R.id.widget, configPendingIntent)被忽略了,就像RemoteViews我仔细构造和发送到的其他内容一样appWidgetManager.updateAppWidget().

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

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

到目前为止似乎没有已知的治疗方法.https://code.google.com/p/android/issues/detail?id=28216#c56上的帖子似乎提供了一些承诺,但我尝试过AppWidgetHost.startListening()在各个地方打电话,包括定期通过重复闹钟看看我是否可以启动小部件,但似乎没有任何工作.

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

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

Kev*_*oil 5

remoteViews.setImageViewBitmap(imageViewID, bmp)
Run Code Online (Sandbox Code Playgroud)

不要这样做.这样做会包含位图并将整个事件作为活页夹事务发送.绑定器旨在传输少量数据,并且不能很好地处理位图.即使小部件不断更新,它也会使用比所需更多的系统资源,以及更多的启动资源(启动器必须取消位图,至少暂时存储已分区的字节和未分区的,并且必须在UI线程上完成)但是您看到的问题是您链接的错误,有时大型活页夹事务会触发a TransactionTooLargeExceptionAppWidgetManagerService通过停止所有未来更新(有时是所有小部件,有时只是您的小部件)来错误地处理此问题.

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