所以,在窗口小部件启动时执行的代码中,我正在创建一个新的RemoteView并添加东西,包括通过remoteViews.setImageViewBitmap(imageViewID,bmp)加载一个新的位图,然后最后调用appWidgetManager.updateAppWidget(appWidgetId,remoteViews)来更新小部件内容.工作很好,直到它停止工作.
我不知道要发布什么代码,因为该东西在99%的时间内工作正常,但是偶尔updateAppWidget()停止工作,没有明显的理由.似乎这是一个系统问题,而不是我的代码中的错误,但我可能是错误的.
似乎可能提示这一点的唯一的事情是连接的变化,例如从无信号到WiFi,也许频繁的这种变化.在这种情况下,似乎会发生更多的事情.
一旦小部件冻结,唯一解冻它的是重新启动设备.不重新启动,即使删除窗口小部件并添加新窗口也不起作用.事实上,添加一个新的结果会导致一个死的窗口小部件甚至不响应点击打开“配置活动”,大概是因为remoteViews.setOnClickPendingIntent(R.id.widget,configPendingIntent)被忽略,就像远程视图中的其他内容一样我仔细构造并发送到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/
有任何想法吗?慢慢地让我疯了!
解决方法
remoteViews.setImageViewBitmap(imageViewID,bmp)
不要这样做做这个包裹的位图,并发送整个事情作为一个活页夹事务.绑定是为了传输少量的数据,不能很好地处理位图.即使当窗口小部件不断更新时,它使用的系统资源要比所需要的更多,并且还有更多的启动器资源(启动器必须打开位图,至少临时存储封闭的字节和未被忽略的字节,并且必须在UI线程上完成但是,您看到的问题是您链接的错误,有时大型绑定事务触发事务TooLargeException,并且AppWidgetManagerService通过停止所有将来的更新(有时到所有小部件,有时只适用于您的)更改错误地处理此问题.
相反,您应该使用setImageViewUri https://developer.android.com/reference/android/widget/RemoteViews.html#setImageViewUri(int,%20android.net.Uri).这是一个更多的工作,因为你需要保存位图,然后发送启动器一个uri为它,虽然目前所有或几乎所有的发射器都有READ_EXTERNAL_STORAGE,所以一个文件:/// uri到外部存储可能工作,你不应该依赖在未来,应该使用FileProvider https://developer.android.com/reference/android/support/v4/content/FileProvider.html