从 activity 的 onCreate 中的“launch”块执行 DB read/write 是否安全?
Is it safe to do DB read/write from a `launch` block within an onCreate of an activity?
我的 android 应用程序在生产环境中崩溃,当我尝试从协程 [=15] 访问数据库时出现不同的异常,例如 IllegalStateException
、SQLiteDiskIOException
、SQLiteCantOpenDatabaseException
等=](为此创建了一个新的 CoroutineScope
like ioCoroutineContext + SupervisorJob()
)块。
从这样的 launch
块进行数据库访问是否健康?除此之外,由于这是应用程序中第一次访问数据库,因此它将 运行 数据库迁移(如果有的话)。
对于数据库操作,我认为使用默认或 IO 线程的异步模式更好。
例如,我正在开发一个应用程序,在该应用程序中,我在 recyclerview 绑定视图持有者中执行 db sqlite 操作,在主线程中使用启动模式作为协程,但是通过这样做,我的回收器视图滞后了很多,所以我没有使用启动,而是移动了在数据库操作的默认线程中使用异步,这进一步提高了性能。
根据@MarkoTopolnik 的回答,我完全同意他的观点,在你的情况下,处理 sqlite 时多线程可能是个问题,你需要准确了解事情的实际执行方式。
我认为您的实际问题是您在 launch
中执行的代码与您在主线程上执行的代码之间的竞争。可能是一个代码路径正在初始化数据库连接,而另一个代码路径正在使用该连接,问题是它们是并发的。也可能是您正在对数据库客户端执行一些非法的多线程访问。
从 launch
ed 块访问数据库本身并不是错误。
我的 android 应用程序在生产环境中崩溃,当我尝试从协程 [=15] 访问数据库时出现不同的异常,例如 IllegalStateException
、SQLiteDiskIOException
、SQLiteCantOpenDatabaseException
等=](为此创建了一个新的 CoroutineScope
like ioCoroutineContext + SupervisorJob()
)块。
从这样的 launch
块进行数据库访问是否健康?除此之外,由于这是应用程序中第一次访问数据库,因此它将 运行 数据库迁移(如果有的话)。
对于数据库操作,我认为使用默认或 IO 线程的异步模式更好。
例如,我正在开发一个应用程序,在该应用程序中,我在 recyclerview 绑定视图持有者中执行 db sqlite 操作,在主线程中使用启动模式作为协程,但是通过这样做,我的回收器视图滞后了很多,所以我没有使用启动,而是移动了在数据库操作的默认线程中使用异步,这进一步提高了性能。
根据@MarkoTopolnik 的回答,我完全同意他的观点,在你的情况下,处理 sqlite 时多线程可能是个问题,你需要准确了解事情的实际执行方式。
我认为您的实际问题是您在 launch
中执行的代码与您在主线程上执行的代码之间的竞争。可能是一个代码路径正在初始化数据库连接,而另一个代码路径正在使用该连接,问题是它们是并发的。也可能是您正在对数据库客户端执行一些非法的多线程访问。
从 launch
ed 块访问数据库本身并不是错误。