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

Architecture of own SDK - async method API in Kotlin

我们正在为我们的产品构建 public SDK。它是用 Kotlin 构建的,我们在内部使用协程。然而,我们想要发布一个可用形式 JAVA 的 API,这就是为什么不能提供可挂起的功能,如 public API.

没关系,如果 Java 中的可用性不如 Kotlin 中的舒适性,那是意料之中的。

因此,例如,我们正在寻找以下异步方法的 return 类型:

class Sdk {
    fun getPlace(): ___
}

我们考虑的事项:

  1. 使用 RX Java 作为接口。我们不喜欢这种解决方案,Rx 非常复杂,我们希望尽可能少地添加其他依赖项。通常,我们会选择 returning Single。但是,Rx java 我们不想解决的事情(哪个线程应该完成工作)和 Rx 不解决我们想解决的事情(如果可能的话),例如生命周期和观察者 - Android 架构组件中解决的问题。

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

  3. Android 架构 LiveData。返回一个 LiveData 似乎没问题,还有一个 observeForever() 方法可以在后台线程中使用它。另一方面,api 表明它可能 return 重复多个结果。但是我们绝对希望仅在结果或一个异常时省略。不过,在 Kotlin 中,我们可以实现扩展函数,这将使它像 sdk.getPlace().await().

  4. 一样非常有用
  5. 自定义解决方案:return一个简单的结果对象,您可以通过提供回调来订阅结果sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} });我们将提供等待的扩展功能。

问题:

  1. 我们是否错过了一些重要的东西 aspect/library/possibility?
  2. 我们应该选择哪种解决方案以及为什么。

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

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

我看到 2 个解决方案:

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

如果我是你,我也会考虑为 Java/Kotlin 用户公开不同的 API 方法。 Kotlin 用户将感谢您提供更简洁的方式,例如协程,调用SDK的方法。