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

Android appwidget冻结并拒绝更新:忽略updateAppWidget,android,google-api,android-appwidget,remoteview,appwidgetprovider,Android,Google Api,Android Appwidget,Remoteview,Appwidgetprovider,因此,我有一个应用程序小部件,它可以很好地刷新,像时钟一样定期将一个新位图加载到ImageView。然后,在某个时刻,它将停止进一步更新。我可以从日志和我的代码正在查询的服务器上的活动中看出,小部件实际上仍在继续定期启动(通过onReceive()捕获的广播,并按预期完成它的工作。唯一没有发生的事是小部件内容没有更新 因此,在小部件启动时执行的代码中,我创建了一个新的RemoteView并向其中添加内容,包括通过RemoteView.setImageViewBitmap(imageViewID,

因此,我有一个应用程序小部件,它可以很好地刷新,像时钟一样定期将一个新位图加载到
ImageView
。然后,在某个时刻,它将停止进一步更新。我可以从日志和我的代码正在查询的服务器上的活动中看出,小部件实际上仍在继续定期启动(通过
onReceive()
捕获的广播,并按预期完成它的工作。唯一没有发生的事是小部件内容没有更新

因此,在小部件启动时执行的代码中,我创建了一个新的RemoteView并向其中添加内容,包括通过
RemoteView.setImageViewBitmap(imageViewID,bmp)
加载一个新位图,然后最后调用
appWidgetManager.UpdateAppWidgetId(appWidgetId,RemoteViews)
更新小部件内容。工作良好…直到它停止工作

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

唯一可能提示这一点的是,当连接发生变化时,例如从无信号切换到WiFi时,可能会频繁出现这种变化。在这些情况下,这种情况似乎发生得更多

一旦小部件冻结,唯一能解冻它的就是重新启动设备。如果不重新启动,甚至删除小部件并添加新的小部件都不起作用。事实上,添加新的小部件会导致一个死小部件,它甚至不会响应打开配置活动的单击,可能是因为
remoteViews.setOnClickPendingIntent(R.id.widget,configpendingent)
与远程视图中的所有内容一样被忽略我仔细构造并发送到
appWidgetManager.updateAppWidgetGet()

这似乎与这里许多其他人所描述的差不多:

到目前为止,似乎还没有已知的治疗方法。上的帖子似乎提供了一些希望,但我尝试在不同的地方调用
AppWidgetHost.startListening()
,包括定期通过重复警报查看是否可以启动小部件,但似乎没有任何效果

其他用户(而不是开发人员)似乎也看到了这个问题:

有什么想法吗?我都快疯了

remoteViews.setImageViewBitmap(imageViewID, bmp)
不要这样做。这样做会将位图打包,并将整个内容作为活页夹事务发送。活页夹用于传输少量数据,不能很好地处理位图。即使小部件不断更新,它也会使用比需要更多的系统资源和更多的启动器资源(启动程序必须解列位图,至少临时存储已打包字节和未加速字节,并且必须在UI线程上完成。但您看到的问题是您链接的错误,有时大型绑定事务会触发
TransactionTooLargeException
AppWidgetManagerService
错误ly通过停止所有将来的更新(有时对所有小部件,有时仅对您的小部件)来处理此问题


相反,您应该使用
setImageViewUri
。这需要做更多的工作,因为您需要保存位图,然后向启动器发送一个uri,尽管目前所有或几乎所有启动器都有
READ\u EXTERNAL\u存储
,所以
文件://
uri到外部存储可能会起作用,您以后不应该依赖它相反,我应该使用
文件提供程序

我也没有找到解决方案,但我找到了一个解决办法(虽然不是一个好办法)。我发现,一旦我从主屏幕上删除了其他几个类似的小部件,问题就消失了。我的小部件与Play Store上的其他小部件相似,因此我的主屏幕上也有一些来自竞争对手的小部件。自从我删除了它们的小部件后,我的小部件一直在更新,没有任何故障。我还尝试释放尽可能多的内存可能的,清除的应用缓存,以及logcat(在电话中拨*#9900,然后点击“删除转储状态/logcat”按钮)。从那以后一切正常。