我正在开发一个下载管理器应用,我正在使用lingochamp filedownloader library从不同的活动中下载文件。
在这里,我想保留下载文件的历史记录,但根据a discussion here,该库不会保留这样的文件列表。
所以,我想过填充List然后使用Gson将它转换为json&使用共享首选项保存它。
每次下载开始,暂停,取消或完成下载时,json字符串都会转换回列表,然后列表会更新并保存回json。但由于有多个活动将访问同一个列表,因此可能存在可能导致数据不一致的并发问题。
那么,我该如何开发呢?或者上述方法是否不正确并且有更好的方法可用?
答案 0 :(得分:0)
当您只访问onStart()和onStop()或onResume()/ onPause()之间的首选项时,不应该出现并发问题,因为只有一个活动可以处于该状态。因此,只有在使用不同的线程访问首选项时才会发生这种情况。即便如此,我认为SharedPreferences可能无需任何更改即可处理它。至少我不知道我们遇到过这个问题。
反正。如果您遇到并发问题,可能需要将SharedPreferences包装在Singleton对象中并访问History对象的同步实例。然后,当有人添加数据并首先更改历史对象以供其他组件访问时,您只需保存它。然后,在实例化包装器的实例时,您只需要从首选项中读取一次数据。
另外我应该告诉你,你应该使用像sqlite这样的东西来保存这些数据,因为在首选项中保存它会违反SharedPreferences的含义,并且要求你在更改或更改时获取,更改然后保存所有数据。添加一个条目。然后,我不会否认我已经不止一次使用过这种方法,并且它适用于少量数据。