gpt4 book ai didi

android - 等待数据库插入,Kotlin Coroutine

转载 作者:行者123 更新时间:2023-12-02 13:17:49 24 4
gpt4 key购买 nike

我有一个正在做一些Room DB和一些Retrofit调用的类(Repo)。对于Retrofit调用,我使用的是Rx;对于Room,我使用的是Coroutine

现在,问题出在一个按钮上,单击“我必须同时执行数据库和API调用”。

  • 更新 DB
  • 中的一些报告
  • 服务器上上传图像
  • 将报告发送到服务器
  • 数据库中的
  • 更新报告

  • 由于RX和协同程序的混合,我无法进行一些顺序调用。如上所述,步骤必须为 SEQUENTIAL 。但第一步需要花费时间才能执行,因此会覆盖最后一步的数据。

    我想确保在完成其他工作之前先完成第一步。

    这是我正在使用的一些代码
    fun submit(
    report : Report,
    images: List<Image>,
    comment: List<Comments>
    ): Completable {

    var completable: Completable

    runBlocking {
    roomRepo.saveReport(report, images, comment)
    }
    /////////////// Here I need to wait for the above to finish

    val analysisImageList = uploadImages(images)

    completable = myAPi.putAnalysisList(analysisResponse).doOnComplete {
    roomRepo.updateReportStatus(report.id, Pending)
    }.applyNetworkSchedulersCompletable()

    return completable
    }

    而且,这就是 saveReport的样子
    suspend fun saveReport(
    report : Report,
    images: List<Image>, comment: List<Comments>
    ) {
    reportDao.insertReportCard(report) /// insertReportCard() is a suspend function

    for (image in images) {
    image.projectId = report.uuid
    imageDao.insertImage(image) /// insertImage() is a suspend function
    }

    comment ?: return
    for (coment in comment) {
    hotspotCommentDao.
    insertHotspotComments(coment) /// insertHotspotComments() is a suspend function
    }
    }

    最佳答案

    可能已经有一个库(不确定),但是您可以创建一个将Completables转换为协程的函数,以便可以在协程中使用它们。该函数将挂起,直到blockingAwait()调用在某个后台线程上返回。

    suspend fun Completable.await() = withContext(Dispatchers.Default) {
    blockingAwait()
    }

    然后,您的 submit函数可以是一个暂停函数,因此您可以在协程中使用它:
    suspend fun submit(
    report : Report,
    images: List<Image>,
    comment: List<Comments>
    ) {
    roomRepo.saveReport(report, images, comment)
    val analysisImageList = uploadImages(images)

    myAPi.putAnalysisList(analysisResponse).doOnComplete {
    roomRepo.updateReportStatus(report.id, Pending)
    }
    .applyNetworkSchedulersCompletable()
    .await()
    }

    关于android - 等待数据库插入,Kotlin Coroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61776439/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com