android 挂起协程的执行以等待回调

eqqqjvef  于 2023-06-27  发布在  Android
关注(0)|答案(1)|浏览(196)

最近,我将协程应用到我的项目中,一切似乎都很好,但今天我遇到了一个问题Upload file/image into server using Coroutine + Retrofit
似乎没有办法用协程+ Retrofit来解决上传文件的问题,所以我们必须使用回调来进行改造。

  1. //Api interface
  2. interface UploadFileApiKotlin {
  3. @Multipart
  4. @POST("/uploadFileApi")
  5. fun uploadFiles(
  6. @Part listUri: List<MultipartBody.Part>
  7. ): Call<Response<List<FileResponse>?>>
  8. }
  9. //ViewModel class
  10. serviceScope.launch {
  11. //Insert into db
  12. repository.insertNewExtAct()
  13. //Send data into server.
  14. val call = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList)
  15. call.enqueue(object : Callback<Response<List<FileResponse>?>> {
  16. override fun onResponse(
  17. call: Call<Response<List<FileResponse>?>>,
  18. response: Response<Response<List<FileResponse>?>>
  19. ) {
  20. TODO("Not yet implemented")
  21. }
  22. override fun onFailure(
  23. call: Call<Response<List<FileResponse>?>>,
  24. t: Throwable
  25. ) {
  26. TODO("Not yet implemented")
  27. }
  28. })
  29. //Wait for response from server and do logic
  30. }

我的问题是:我如何挂起协程的执行来等待reflect的回调?

odopli94

odopli941#

您可以使用suspendCoroutinesuspendCancellableCoroutine来处理回调(将回调转换为suspend函数):

  1. serviceScope.launch {
  2. //Insert into db
  3. repository.insertNewExtAct()
  4. //Send data into server.
  5. uploadFile()
  6. //Wait for response from server and do logic
  7. }
  8. suspend fun uploadFile() = suspendCoroutine<Response<List<FileResponse>?>> { continuation ->
  9. val call = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList)
  10. call.enqueue(object : Callback<Response<List<FileResponse>?>> {
  11. override fun onResponse(
  12. call: Call<Response<List<FileResponse>?>>,
  13. response: Response<Response<List<FileResponse>?>>
  14. ) {
  15. // Resume coroutine with a value provided by the callback
  16. continuation.resumeWith(response.data)
  17. }
  18. override fun onFailure(
  19. call: Call<Response<List<FileResponse>?>>,
  20. t: Throwable
  21. ) {
  22. continuation.resumeWithException(t)
  23. }
  24. })
  25. }

suspendCoroutine挂起它在其中执行的协程,直到我们决定通过调用适当的方法-Continuation.resume...来继续。suspendCoroutine主要在我们有一些带有回调的遗留代码时使用。
还有suspendCancellableCoroutine构建器函数,它的行为类似于suspendCoroutine,但具有额外的功能-为块提供CancellableContinuation的实现。

展开查看全部

相关问题