【问题标题】:Android Filedownloader library: How to maintain a list / history of downloaded files?Android Filedownloader 库:如何维护下载文件的列表/历史记录?
【发布时间】:2017-01-31 13:08:51
【问题描述】:
我正在开发一个下载管理器应用程序,我在其中使用lingochamp filedownloader library 从不同的活动中下载文件。
在这里,我想维护下载文件的历史记录,但根据a discussion here,库不维护这样的文件列表。
所以,我想到了填充一个列表,然后使用 Gson 将其转换为 json 并使用共享首选项保存它。
每次下载开始、暂停、取消或完成时,json 字符串都会转换回列表,然后列表会更新并保存回 json。但由于有多个活动将访问同一个列表,因此可能会出现并发问题,从而导致数据不一致。
那么,我应该如何进行开发呢?还是上述方法不正确,有更好的方法可用?
【问题讨论】:
标签:
android
json
concurrency
sharedpreferences
download-manager
【解决方案1】:
当您仅访问 onStart() 和 onStop() 或 onResume()/onPause() 之间的首选项时,不应存在并发问题,因为只有一个活动可以处于该状态。因此,只有当您使用不同的线程来访问首选项时,才会发生这种情况。即便如此,我认为 SharedPreferences 可能无需任何更改即可处理它。至少我不知道我们曾经在这方面遇到过问题。
无论如何。如果您遇到并发问题,您可能希望将 SharedPreferences 包装在单例对象中并访问历史对象的同步实例。然后,当有人添加数据并首先更改您的历史对象以供其他组件访问时,您只需保存它。然后,您只需在实例化包装器实例时从首选项中读取数据一次。
另外我应该告诉你,你应该使用类似 sqlite 的东西来保存这些数据,因为在首选项中保存它违背了 SharedPreferences 的含义,并且需要你在更改或更改时获取、更改然后保存所有数据添加一个条目。再说一次,我不会否认我不止一次使用过这种方法,而且它适用于少量数据。