Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在一个活动的onCreate中从'launch'块进行DB读/写安全吗?_Android_Kotlin_Kotlin Coroutines - Fatal编程技术网

Android 在一个活动的onCreate中从'launch'块进行DB读/写安全吗?

Android 在一个活动的onCreate中从'launch'块进行DB读/写安全吗?,android,kotlin,kotlin-coroutines,Android,Kotlin,Kotlin Coroutines,我的android应用程序在生产中崩溃,出现了不同的异常,如IllegalStateException、SQLiteDiskIOException、SqliteContoPendDatabaseException等。当我尝试从协同程序启动访问DB时,我为类似ioCoroutineContext+SupervisorJob的块创建了一个新的协同程序作用域 从这样的启动块进行DB访问是否健康?此外,由于这是应用程序中首次访问数据库,因此如果有数据库迁移,它将运行数据库迁移。对于数据库操作,我认为使用

我的android应用程序在生产中崩溃,出现了不同的异常,如IllegalStateException、SQLiteDiskIOException、SqliteContoPendDatabaseException等。当我尝试从协同程序启动访问DB时,我为类似ioCoroutineContext+SupervisorJob的块创建了一个新的协同程序作用域


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

对于数据库操作,我认为使用默认异步模式或IO线程更好

例如,我在一个应用程序上工作,我在recyclerview bind view holder中执行db sqlite操作,在主线程中以启动模式作为协程,但是通过这样做,我的recycler视图滞后了很多,因此我没有使用启动,而是在db操作的默认线程中使用异步,这进一步提高了性能改进


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

对于数据库操作,我认为使用带默认线程或IO线程的异步模式更好

例如,我在一个应用程序上工作,我在recyclerview bind view holder中执行db sqlite操作,在主线程中以启动模式作为协程,但是通过这样做,我的recycler视图滞后了很多,因此我没有使用启动,而是在db操作的默认线程中使用异步,这进一步提高了性能改进


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

我认为您实际的问题是在启动内部执行的代码与在主线程上执行的代码之间的竞争。可能是一个代码路径正在初始化DB连接,另一个正在使用该连接,问题是它们是并发的。也可能是您正在对DB客户端执行一些非法的多线程访问


从启动的块访问DB本身并不是一个错误。

我认为您实际的问题是在启动内部执行的代码与在主线程上执行的代码之间的竞争。可能是一个代码路径正在初始化DB连接,另一个正在使用该连接,问题是它们是并发的。也可能是您正在对DB客户端执行一些非法的多线程访问


从启动的块访问DB本身并不是一个错误。

当您进行recylcerView修复时,您在哪里为异步进行了等待,或者我可以将不同的对象绑定到UIWell吗?在我的情况下,不需要等待。我只是使用协程在后台线程中设置我的db操作来解决延迟问题。但是,当对多个线程使用sqlite db操作时,由于引用问题,它可能会导致运行时崩溃,因此需要解决这将转到您的db helper类,并从要用于协同路由的方法中删除db.close!如果你还没有完全开发你的应用程序,我强烈建议你使用比sqlite好10倍的Realm数据库,sqlite无疑是原生的,但实际上它很烂!谢谢将在我的下一个应用程序中试用realm!!Dispatchers.Default和Dispatchers.IO只是两个线程池,除了允许它们启动多少线程的策略之外,它们在任何方面都是相等的。默认值针对CPU限制的工作进行了优化,最多可运行可用的处理器线程,而IO则用于阻塞操作,它是一个弹性线程池,默认情况下最多可启动1000个线程。所以绝对不要使用默认值来阻止网络操作。当您进行recylcerView修复时,您在哪里为异步进行了等待,或者我可以将不同的对象绑定到UIWell吗?在我的情况下,不需要等待。我只是使用协程在后台线程中设置我的db操作来解决延迟问题。但是,当对多个线程使用sqlite db操作时,由于引用问题,它可能会导致运行时崩溃,因此需要解决这将转到您的db helper类,并从要用于协同路由的方法中删除db.close!如果你还没有完全开发你的应用程序,我强烈建议你使用比sqlite好10倍的Realm数据库,sqlite无疑是原生的,但实际上它很烂!谢谢将在我的下一个应用程序中试用realm!!Dispatchers.Default和Dispatchers.IO只是两个线程池,除了允许它们启动多少线程的策略之外,它们在任何方面都是相等的。默认值针对CPU限制的工作进行了优化,最多可运行可用的处理器线程,而IO则用于阻塞操作,它是一个弹性线程池,默认情况下最多可启动1000个线程。所以绝对不要对bloc使用默认值
king network ops。如果迁移在一个协同路由启动上运行,而我尝试从另一个协同路由启动进行读/写,会不会出现问题?这听起来肯定是个问题,迁移是数据库架构的非事务性更新。您应该确保所有迁移都发生在对数据库进行任何查询之前。如果迁移在一个协同程序启动上运行,而我尝试从另一个协同程序启动读/写,是否会出现问题?这听起来肯定是个问题,迁移是数据库架构的非事务性更新。您应该确保所有迁移都发生在对数据库进行任何查询之前。