Android的SQLite界面文档提到,数据库访问应从IntentService
执行,因为它们可能是长时间运行的操作,因此GUI线程不应在它们上面阻塞。
IntentService
不会在没有其他Intent
排队的情况下立即关闭,这基本上会在每个请求之后发生,因此也会为每个查询建立和销毁数据库句柄,这似乎很浪费。
是否可以将IntentService
保留更长的时间,或者以其他方式避免在GUI线程中发布更多Intent
与服务回答它们之间的竞争?
我应该只使查询Intent
包含应全部执行的查询列表,还是会导致消息大小出现其他问题?
答案 0 :(得分:0)
Android的SQLite界面文档中提到,数据库访问应从IntentService执行,因为它们可能是长期运行的操作,因此GUI线程不应阻塞它们。
所有形式的I / O都应在后台线程上执行,以免阻塞主应用程序线程。考虑到Android 8.0+上的更改,IntentService
本身并不是一个好选择。
如今,更典型的方法是由单例存储库管理数据库访问(无论是手动创建的单例还是通过依赖项注入框架提供给您的单例)。在后台线程上执行I / O时,存储库可以使用多种方法来提供响应式API,包括:
LiveData
和普通线程,执行程序等。如果将Room用作数据库访问层,它将为您提供所有这三个选项“免费”。其他一些ORM也提供类似的功能。
有没有办法使
IntentService
保持更长的时间,或者以其他方式避免在GUI线程中发布更多的Intent和服务响应它们之间的竞争?
后台服务只能运行一分钟。如果您担心的是打开数据库的开销,请使用单例存储库,并且每次进程调用仅打开一次。您完全不需要服务的可能性也很大。如果您有前台UI,则服务可能毫无意义。
我应该让我的查询意图包含一系列应该全部执行的查询吗??
可能,但是再次重申,在这里使用服务可能不是必需的,并且肯定会使问题更加复杂。
所以:对I / O使用后台线程。那不必涉及服务。