从活动的onCreate内的`launch`块中读取/写入DB是否安全?

viz*_*tiz 1 android kotlin kotlin-coroutines

当我尝试从协程(为此创建了一个新的)块访问数据库时IllegalStateException,我的android应用正在生产中崩溃,并带有SQLiteDiskIOExceptionSQLiteCantOpenDatabaseException等不同异常。launchCoroutineScopeioCoroutineContext + SupervisorJob()

从这样的launch块进行数据库访问是否健康?除此之外,由于这是对应用程序中数据库的首次访问,因此它将运行数据库迁移(如果有)。

Mr.*_*tel 5

对于数据库操作,我相信使用带有Default或IO线程的异步模式更好。

例如我正在一个应用程序中,在recyclerview绑定视图持有人中在主线程中以启动模式作为协程进行db sqlite操作,但是通过这样做,我的recycler视图滞后了很多,所以我不使用启动,而是在默认情况下转到异步数据库操作线程,进一步提高了性能。

正如@MarkoTopolnik的Per回答,我完全同意他的观点,在处理sqlite时,您的问题可能是多线程问题,您需要精确地了解事情的实际执行方式。

  • Dispatchers.Default和Dispatchers.IO只是两个线程池,除了允许启动多少个线程的策略外,在所有方面都相等。“默认”是针对CPU绑定工作而优化的,最多可运行“ availableProcessors()”线程,而“ IO”则用于阻止操作,它是一个弹性线程池,默认情况下最多可启动1000个线程。因此,绝对不要使用“默认”来阻止网络操作。 (2认同)