自己的SDK架构 – Kotlin中的异步方法API

我们正在为我们的产品构建一个公共的SDK。 它是用Kotlin和内部我们使用协程。 但是,我们想要发布一个可用于JAVA的API,这就是为什么不能提供挂起的function作为公共API。

如果Java中的可用性不如Kotlin那么舒服,那么我们也可以。

所以,例如,我们正在寻找下面的异步方法的返回types:

class Sdk { fun getPlace(): ___ } 

我们考虑过的事情:

  1. 使用RX Java作为接口。 我们不喜欢这个解决方案,Rx非常复杂,我们希望尽可能少地添加其他的依赖关系。 一般来说,我们会去返回单。 但是,Rx java我们不想解决的问题(哪个线程应该是已完成的工作),而Rx并不解决我们想要解决的问题(如果可能的话),例如生命周期和观察者 – Android架构组件中解决的问题。

  2. Java 8的未来。 这似乎是最合适的,但不可能,因为我们需要针对较旧的Android(至少4.1)。

  3. Android架构LiveData。 返回一个LiveData似乎没问题,还有一个observeForever()方法,使它可以在后台线程中使用。 另一方面,api表明它可能会重复返回多个结果。 但是,我们只希望在结果或者一个例外上忽略。 但是,在Kotlin中,我们可以实现扩展函数,这将使得它可以像sdk.getPlace().await()

  4. 自定义解决方案:返回一个简单的Result对象,通过提供一个回调sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} }) 我们将提供一个等待的扩展function。

问题:

  1. 我们错过了一些重要的方面/图书馆/可能性吗?
  2. 我们应该选择哪种解决方案,为什么

我不确定这个问题是否有具体的答案。 所以下面的只是我的意见。 你可以同意或不同意。 有很多不同的方法来实现OP所要求的。

就个人而言,我不会在Rx或带有LiveData的架构组件上包含任何依赖关系。 虽然很多现代应用程序使用这些依赖关系,但我认为在您的SDK中拥有大量第三方依赖关系并不是一个好主意。 其他开发人员可能会覆盖他们,这可能会导致不可预知的结果。

我看到2个解决方案:

  1. 问问自己,你是否可以使这种方法不是异步的,让客户弄清楚如何使用它们。 这可能听起来不是非常用户友好的,但是作为开发人员,您知道他们最终可能会在SDK回调中使用自己的异步封装。
  2. 使用自定义回调。 这是在Android世界中提供一个公共API的一个非常直接和常见的方式。 如果其他开发者使用Rx,那么他们知道如何包装这些方法来跟随他们的流。 LiveData用户也是如此。

如果我是你,我还会考虑为Java / Kotlin用户公开不同的API方法。 Kotlin用户会感谢你提供一个更简洁的方法,比如协程,来调用SDK的方法。