3

我们正在为我们的产品构建一个公共 SDK。它是用 Kotlin 构建的,在内部我们使用协程。但是,我们想发布一个可以从 JAVA 中使用的 API,这就是为什么不能提供可暂停功能作为公共 API 的原因。

我们没关系,如果 Java 中的可用性不如 Kotlin 中那么舒服,那也是意料之中的。

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

class Sdk {
    fun getPlace(): ___
}

我们考虑过的事情:

  1. 使用 RX Java 作为接口。我们不喜欢这种解决方案,Rx 相当复杂,我们希望尽可能少地添加其他依赖项。通常,我们会选择返回 Single。但是,我们不想解决的 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) {} });我们将提供等待的扩展功能。

问题:

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

1 回答 1

3

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

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

我看到了 2 个解决方案:

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

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

于 2017-10-03T08:43:55.260 回答