【问题标题】:Suspend several functions invocations and use the returned value of first invoked in the rest of them?暂停几个函数调用并在其余函数中使用第一个调用的返回值?
【发布时间】:2021-03-14 18:10:25
【问题描述】:

上下文:我有一个应用会根据用户交互多次发送相同的请求。

我需要尽可能减少 IO 操作,所以我的想法是以某种方式将请求排入队列,直到第一个请求解决。然后在排队的请求中使用获取的数据。

我认为实现此目的的一种方法是使用 Java 并发 API(BlockingQueue,仅举一例)。

我已经在使用协程和挂起函数,并且可以很好地使用它们,但遗憾的是我目前对这些主题的了解还不够。

示例:

suspend fun getDataAndCalculate(): Int {
    val data = remote.getDataFromServer()
    return calculate(data)
}

函数getDataAndCalculate() 可以从多个线程中多次调用,最好在remote.getDataFromServer() 正在执行时以某种方式将所有这些调用加入队列或挂起。当remote.getDataFromServer() 返回时,在所有待处理的getDataAndCalculate() 调用中使用data

¿ 有什么想法或建议吗? ¿ 这是推荐的吗? ¿ 你知道解决这类问题的任何设计模式吗?

谢谢!

(不太清楚标题,希望能描述我想要完成的工作,否则,我可以改进它。)

【问题讨论】:

    标签: android concurrency retrofit2 kotlin-coroutines


    【解决方案1】:

    我能想到的一种可能且简单的解决方案:

    1. 创建内存缓存,简单地将返回值保存在存储库级别。您也可以添加时间戳,如果您认为响应已过时,请在挂起函数级别进行验证。
    2. 添加一个状态,表示请求是否已在运行(一个简单的标志,如 var isRunning: Boolean,如果它已经在运行,则暂停,直到您获得缓存值。

    虽然它可能不是最好的方法,但其他简单的解决方案:

    1. 如果您熟悉 Channels 或 Flows,您可能可以编写一些去抖动逻辑
    2. 在您的 ViewModel 级别,检查上一个请求是否完成。相同的isRunning 功能,具有需要从同一个虚拟机启动请求的约束。

    这些可以完成这项工作,但它可能不是最优雅的解决方案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2020-08-25
      • 2018-02-01
      • 1970-01-01
      相关资源
      最近更新 更多