问题描述
嗨,我有一个 kotlin 用例,我想从 Java 代码中调用它,我该怎么做。这是我试过的
这是我的用例
@PerApp
class OnStandUseCase @Inject constructor(
private val orderRepository: OrderRepository,private val serviceOrderTypeProvider: ServiceOrderTypeProvider
) : UseCaseCoroutine<GenericResponse,OnStandUseCase.Params>() {
override suspend fun run(params: Params) = orderRepository.notifyOnStand(
serviceOrderTypeProvider.apiPathFor(params.serviceType),params.id,params.action
)
data class Params(val serviceType: String,val id: String,val action: TimestampedAction)
}
用例协程
abstract class UseCaseCoroutine<out Type,in Params> where Type : Any {
abstract suspend fun run(params: Params): Type
operator fun invoke(params: Params,onResult: (type: Type) -> Unit = {}) {
val job = GlobalScope.async(dispatchers.IO) { run(params) }
GlobalScope.launch(dispatchers.Main) { onResult(job.await()) }
}
}
这就是我在我的 kotlin 类中调用它的方式
try {
onStandUseCase(OnStandUseCase.Params(serviceType,id,action)) {
callback.invoke(it)
}
} catch (exception: Exception) {
onStandResponseErrors()
}
这是我试过的
onStandUseCase.run(new OnStandUseCase.Params("abcd","1",new TimestampedAction("1","2"))){
}
我收到错误 Expected 2 arguments but found only one
请提出任何建议
谢谢 R
解决方法
您不能从 Java 调用 suspend
函数。 (技术上可以,但正确会非常困难,我强烈建议您避免尝试。)
在您的 Kotlin 代码中,编写一个不是挂起函数的函数,该函数将其转换为适当的 Java 习惯用法——RxJava 结果或未来。改为从 Java 调用 那个 方法。