SQLite数据库作为IntentService,是否缓存数据库状态?

时间:2019-02-17 22:05:58

标签: android intentservice

Android的SQLite界面文档提到,数据库访问应从IntentService执行,因为它们可能是长时间运行的操作,因此GUI线程不应在它们上面阻塞。

IntentService不会在没有其他Intent排队的情况下立即关闭,这基本上会在每个请求之后发生,因此也会为每个查询建立和销毁数据库句柄,这似乎很浪费。

  • 是否可以将IntentService保留更长的时间,或者以其他方式避免在GUI线程中发布更多Intent与服务回答它们之间的竞争?

    < / li>
  • 我应该只使查询Intent包含应全部执行的查询列表,还是会导致消息大小出现其他问题?

1 个答案:

答案 0 :(得分:0)

  

Android的SQLite界面文档中提到,数据库访问应从IntentService执行,因为它们可能是长期运行的操作,因此GUI线程不应阻塞它们。

所有形式的I / O都应在后台线程上执行,以免阻塞主应用程序线程。考虑到Android 8.0+上的更改,IntentService本身并不是一个好选择。

如今,更典型的方法是由单例存储库管理数据库访问(无论是手动创建的单例还是通过依赖项注入框架提供给您的单例)。在后台线程上执行I / O时,存储库可以使用多种方法来提供响应式API,包括:

  • RxJava
  • LiveData和普通线程,执行程序等。
  • kotlin协程

如果将Room用作数据库访问层,它将为您提供所有这三个选项“免费”。其他一些ORM也提供类似的功能。

  

有没有办法使IntentService保持更长的时间,或者以其他方式避免在GUI线程中发布更多的Intent和服务响应它们之间的竞争?

后台服务只能运行一分钟。如果您担心的是打开数据库的开销,请使用单例存储库,并且每次进程调用仅打开一次。您完全不需要服务的可能性也很大。如果您有前台UI,则服务可能毫无意义。

  

我应该让我的查询意图包含一系列应该全部执行的查询吗??

可能,但是再次重申,在这里使用服务可能不是必需的,并且肯定会使问题更加复杂。

所以:对I / O使用后台线程。那不必涉及服务。