【问题标题】:how to access kotlin code from java class如何从 java 类访问 kotlin 代码
【发布时间】:2021-01-05 21:49:28
【问题描述】:

您好,我有一个 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)
}

UseCaseCoroutine

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()
        }

但是从 java 类调用的等价物是什么

这是我尝试过的

 onStandUseCase.run(new OnStandUseCase.Params("abcd", "1", new TimestampedAction("1","2"))){
            
        }

我收到一个错误Expected 2 arguments but found only one

不确定从 java 代码调用用例的正确方法是什么

请给点建议

谢谢 回复

【问题讨论】:

  • 您好@assylias 我确实尝试过,但没有成功

标签: java android kotlin use-case


【解决方案1】:

您不能从 Java 调用 suspend 函数。 (从技术上讲你可以,但正确做到这一点非常困难,我强烈建议你不要尝试。)

在您的 Kotlin 代码中,编写一个不是挂起函数的函数,该函数将其转换为适当的 Java 惯用语——RxJava 结果或未来。而是从 Java 调用 that 方法。

【讨论】:

  • ohh noo.. 最初使用 rxjava 的用例将它们移至 Kotlin,只有其他方法是将 java 文件转换为 kotlin。这是一个痛苦,因为它是一个包含大约 2000 行代码的旧文件。
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 2017-10-21
  • 2021-05-29
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
相关资源
最近更新 更多