使用协程 kotlin 的基本用例

Base UseCase with coroutines kotlin

提问人:alGhul7 提问时间:8/28/2023 最后编辑:alGhul7 更新时间:8/28/2023 访问量:54

问:

我想通过以下方式拥有一个BaseUseCase类:

  • 必须允许指示参数。
  • 必须在后台线程中运行工作本身(这将是 doWork 方法)。
  • 必须返回主线程中的值。

我想返回一个值,而不是通过回调返回它,因为我希望调用用例的函数能够在用例完成后直接返回该值。

我有以下方法,但我不知道它是否正确。我使用了两倍的@withContext,所以我不知道是否可以改进。你可以帮我吗?

当前代码:

import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

abstract class SimpleBaseUseCase<out ResultType, in Params> where ResultType : Any {
    private val backgroundDispatcher: CoroutineDispatcher = Dispatchers.IO
    private val uiDispatcher: CoroutineDispatcher = Dispatchers.Main

protected abstract suspend fun doWork(params: Params): Result<ResultType>

/**
 * @param params input data for the background job
 * @return the type of data indicated in @ResultType generic wrapped in a Result object.
 */
open suspend operator fun invoke(params: Params): Result<ResultType> = withContext(uiDispatcher) {
    withContext(backgroundDispatcher) {
        doWork(params)
    }
}

}

而且,调用方将是:

class CustomHandler { 
    //...

    suspend fun methodThatCallsUseCase: Result<String> {
        return useCase("paramExample")
    }
}
Kotlin Kotlin-协程清理 架构 用例

评论

0赞 Jorn 8/28/2023
双打没有意义。您希望在哪个调度程序上运行?只能有一个。从这样的调用是行不通的:外部函数不是,所以它不能调用函数。withContextuseCase()methodThatCallsUseCasesuspendsuspend
0赞 alGhul7 8/28/2023
我添加了“暂停”指示器。我只想在后台线程中执行 doWork() 代码并返回主线程中的值(或用于调用用例的值)
1赞 Jorn 8/28/2023
不,它不是那样工作的。代码的工作方式完全相同,没有外部 .从该块返回后,上下文将返回到调用方的上下文。withContext
0赞 alGhul7 8/28/2023
所以,只是去掉外层,我会以正确的方式得到我想要的东西吗?withContext
1赞 Tenfour04 8/28/2023
挂起函数无法控制其调用方在哪个调度程序上恢复。其调用方将在调用此挂起函数时使用的任何调度程序上恢复。由呼叫者确保其在适当的调度程序上进行非挂起呼叫。

答: 暂无答案