【发布时间】:2021-01-29 02:48:40
【问题描述】:
我正在开发 MVP。在我的 Presenter 中,由于挂起功能,我调用了我的存储库。在这个挂起函数中,我启动了一个协程——而不是在主线程上。 当这个协程完成后,我想执行一些代码:我正在使用 withContext() 来执行此操作。
在我的存储库中,我正在启动一个协程(也许我错了)以使用 DAO 将我的数据插入到我的 Room 数据库中。
当我调试我的应用程序时,它会进入我的 Presenter,但在进入我的存储库之前会崩溃。
演讲者
override suspend fun insertUserResponse(activity: Activity, data: UserResponse) {
scope.launch(Dispatchers.IO) {
try {
userResponseRepository.insertUserResponse(data)
withContext(Dispatchers.Main) {
redirectToClientMainPage(activity)
}
} catch (error: Exception) {
parentJob.cancel()
Log.e("ERROR PRESENTER", "${error.message}")
}
}
}
存储库
override suspend fun insertUserResponse(userResponse: UserResponse) {
GlobalScope.launch(Dispatchers.IO) {
try {
val existingUser: UserResponse? =
userResponseDAO.searchUserByID(userResponse.profilePOJO.uniqueID)
existingUser?.let {
userResponseDAO.updateUser(userResponse)
} ?: userResponseDAO.insertUser(userResponse)
} catch (error: Exception) {
Log.e("ERROR REPOSITORY", "${error.message}")
}
}
}
我的 logcat 中没有显示错误。
编辑:
作用域初始化
private var parentJob: Job = Job()
override val coroutineContext: CoroutineContext
get() = uiContext + parentJob
private val scope = CoroutineScope(coroutineContext)
val uiContext: CoroutineContext = Dispatchers.Main(在我的类构造函数中初始化)
堆栈跟踪
【问题讨论】:
-
在存储库中将
GlobalScope.launch更改为withContext。以及scope是如何初始化的? -
我尝试了您的解决方案,但它仍然崩溃。我已经用作用域的初始化更新了我的主题。
标签: android kotlin android-room androidx kotlin-coroutines