如何在Android上实现持久队列

8
我的应用程序需要一个类似于队列的数据结构:可以在其中放置数据,从中接收数据,并实现先进先出。目前的数据是简单的字符串,以后可能会是更复杂的对象。
问题在于队列及其内容应该是持久化的,无论Android正在做什么。如果应用程序被关闭并重新打开(甚至是Android重新启动),队列应该具有与应用程序关闭之前相同的状态和数据。
我认为队列必须在内部使用某种存储,最好是设备的内部存储。也许你可以进行一些头脑风暴,看如何实现这一点。队列不一定要在我的应用程序中运行,它也可以是某种松散耦合的后台服务,如果在Android中是可能的话(但对我的应用程序是私有的)。
4个回答

9

如果涉及到IT技术的话,Squareup可能是一个不错的选择。

QueueFile是一种闪电般快速、事务性的基于文件的FIFO。添加和移除元素的操作是O(1)级别的,而且具有原子性。写入是同步进行的;在操作返回之前数据将被写入磁盘。底层文件的结构可以保证在进程甚至系统崩溃时仍然存活,如果在变异更改期间抛出了I/O异常,则该更改将被中止。


该库是Tape库,适用于那些想要搜索它的人。 - Brendon Whateley

8

我建议在 Sqlite 中使用表格。我会创建自己的实现队列接口的 SqliteQueueOffer 会将条目添加到表格中。 Poll 将返回一个条目并从表格中删除它。对于更复杂的对象,您可以使用GSON将对象转换为JSON字符串或将JSON字符串转换为对象。


1
我最近为工作编写的应用程序中使用此方法来处理离线同步的扫描条形码。您甚至可以创建一个可序列化的类来存储各种类型的多个数据块,并将其插入到数据库中。由于它在数据库中,所以是持久的,您只需要找到它并将其取回。另一种选择是将其存储为可序列化的文本文件,放在应用程序的私有存储目录中,如果您基本上只是存储应用程序状态。对于单个批次的应用程序状态数据,与数据库存储相比,这更容易。 - Tony Maro
哦,真是巧合。我的意图几乎相同——扫描条形码和类似的东西,并将它们保存在设备上一段时间,例如如果设备处于无信号区域,无法将数据发送到服务器。您认为这也可以可靠地使用内部存储中的文件,还是sqlite数据库在这里是更好的解决方案? - ceran
1
数据库。这样,每次更改时您就不必编写和重新编写文件。您也不必担心解析文件。使用Sqlite助手类也并不困难。 - Frohnzie

3

这是来自 Path 的好的库:

https://github.com/path/android-priority-jobqueue

"一个专门为Android编写的作业队列,可以轻松地安排在后台运行的作业(任务),从而改善用户体验和应用程序稳定性。并提供许多功能,如优先级、网络检查、回调等。"

1

我相信在Java API中不存在这样的数据结构,但是实现自己的队列(Queue)应该没有问题。请查看this文档,其中包含了Android中的数据存储机制的描述。我建议使用SharedPreferences,但您可以选择最适合您的应用程序的方式。您可以扩展实现Queue接口的Java集合之一,并使用Android的存储方法添加持久性机制。希望这可以帮到您。


SharedPreferences 用于原始数据类型(即 int、double、String)。 - Frohnzie
@Frohnzie,Java中的每个集合都有其字符串表示形式。 - Egor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接