我们正在为我们的产品构建一个公共SDK。它是用Kotlin构建的,在内部我们使用协同程序。但是,我们希望发布可用于JAVA的API,这就是为什么不能将可暂停的功能作为公共API提供的。
我们没问题,如果Java中的可用性不如Kotlin那么舒服,那是非常期待的。
因此,例如,我们正在寻找以下异步方法的返回类型:
class Sdk {
fun getPlace(): ___
}
我们考虑过的事情:
使用RX Java作为接口。我们不喜欢这个解决方案,Rx非常复杂,我们希望尽可能少地添加其他依赖项。一般来说,我们会选择返回Single。但是,Rx java我们不想解决的问题(哪个线程应该是完成的工作)并且Rx不能解决我们想要解决的问题(如果可能的话),例如生命周期与观察者 - Android架构组件中解决的问题。
Java 8 Future。这似乎是最合适的,但不可能,因为我们需要针对较旧的机器人(至少4.1)。
Android架构LiveData。返回一个LiveData似乎没问题,还有一个observeForever()方法使它可以在后台线程中使用。另一方面,api表明它可能会重复返回多个结果。但我们只想省略结果或一个例外。但是,在Kotlin中,我们可以实现扩展函数,使其在sdk.getPlace().await()
中非常有用。
自定义解决方案:返回一个简单的Result对象,您可以通过提供回调sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} })
来为结果提供subrcibe;我们将提供等待的扩展功能。
问题:
答案 0 :(得分:3)
我不确定这个问题是否有具体的答案。所以以下只是我的意见。你可以同意也可以不同意。有很多不同的方法来实现OP的要求。
就个人而言,我不会在使用LiveData的Rx或Architecture Components中包含任何依赖项。虽然很多现代应用程序都使用这些依赖项,但我认为在SDK中拥有大量第三方依赖项并不是一个好主意。其他开发人员可以覆盖它们,这可能会导致不可预测的结果。
我看到了两个解决方案:
如果我是你,我也会考虑为Java / Kotlin用户公开不同的API方法。 Kotlin用户会感谢您提供更清洁的方式,例如:协同程序,称为SDK的方法。