Java Kotlin中自有SDK-async方法API的体系结构

Java Kotlin中自有SDK-async方法API的体系结构,java,android,asynchronous,kotlin,kotlin-interop,Java,Android,Asynchronous,Kotlin,Kotlin Interop,我们正在为我们的产品构建一个公共SDK。它是用Kotlin构建的,在内部我们使用协同程序。然而,我们希望发布一个可以从JAVA中使用的API,这就是为什么不能提供可挂起的函数作为公共API的原因 我们还可以,如果Java的可用性不如Kotlin那么舒适,这是意料之中的 例如,我们正在寻找以下异步方法的返回类型: class Sdk { fun getPlace(): ___ } 我们考虑的事项: 使用RXJava作为接口的接口。我们不喜欢这种解决方案,Rx非常复杂,我们希望尽可能少地添

我们正在为我们的产品构建一个公共SDK。它是用Kotlin构建的,在内部我们使用协同程序。然而,我们希望发布一个可以从JAVA中使用的API,这就是为什么不能提供可挂起的函数作为公共API的原因

我们还可以,如果Java的可用性不如Kotlin那么舒适,这是意料之中的

例如,我们正在寻找以下异步方法的返回类型:

class Sdk {
    fun getPlace(): ___
}
我们考虑的事项:

  • 使用RXJava作为接口的接口。我们不喜欢这种解决方案,Rx非常复杂,我们希望尽可能少地添加其他依赖项。一般来说,我们会选择单身。但是,Rx java解决了我们不想解决的问题(哪个线程应该完成工作),Rx也没有解决我们想解决的问题(如果可能的话),例如lifecycle&observer——Android架构组件中解决的问题

  • Java8未来。这似乎是最合适的,但不可能,因为我们需要针对较老的机器人(至少4.1)

  • Android架构LiveData。返回一个LiveData似乎没问题,还有一个observeForRever()方法使它在后台线程中可用。另一方面,api建议它可以重复返回多个结果。但我们肯定只想忽略结果或一个例外。不过,在Kotlin中,我们可以实现扩展函数,使其作为
    sdk.getPlace().await()
    非常可用

  • 自定义解决方案:返回一个简单的结果对象,您可以通过提供一个回调
    sdk.getPlace().observe(观察{onsuccess(data:Place){}onFailure(e:Throwable){}})
    ;我们将为等待提供扩展功能

  • 问题是:

  • 我们是否错过了一些重要方面/库/可能性
  • 我们应该选择哪种解决方案以及原因

  • 我不确定这个问题是否有具体的答案。因此,以下只是我的观点。你可以同意也可以不同意。有很多不同的方法来实现OP的要求

    就个人而言,我不会在LiveData中包含对Rx或架构组件的任何依赖性。虽然很多现代应用程序都使用这些依赖项,但我认为在SDK中有很多第三方依赖项不是一个好主意。其他开发人员可能会覆盖它们,从而导致不可预测的结果

    我看到两种解决方案:

  • 问问自己是否可以将此方法设置为非异步,并让客户机知道如何使用它们。这听起来可能对用户不太友好,但作为开发人员,您知道他们最终可能会在SDK回调中使用自己的异步包装器
  • 使用自定义回调。这是在Android世界中提供公共API的一种非常简单和常见的方法。如果其他开发人员使用Rx,那么他们知道如何包装这些方法以跟随他们的流。LiveData用户也是如此

  • 如果我是你,我也会考虑为Java/Kotlin用户公开不同的API方法。Kotlin用户将感谢您提供了一种更干净的方法,例如协同路由,来调用SDK的方法。

    您是否了解?它有一些Java特性,可以移植到早期的Java版本。那么google services的
    Task
    呢?在Kotlin中,由于您的建议,您可以在其上使用lambda,也可以只使用
    task.getResult()
    。我们尝试了两种方法——一种是回调方法,另一种是kotlin的suspend方法。但随着时间的推移,情况变得相当混乱。目前,我们已经实现了所有的同步功能,当我们的代码在UI线程上运行时,我们会抛出一个异常。很抱歉,结果是一团糟。好吧,至少你们知道这是行不通的:)我认为分享你们的经验是值得的。你介意回答你自己的问题吗?我认为这对其他开发者来说会很有趣。