本文介绍了暂停执行协程以等待回调的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
最近,我在我的项目中应用了Cooutine,看起来一切都很好,但今天我遇到了一个问题[使用Coroutine+Retrofit将文件/图像上传到服务器][1] Cooutine+Retrofit上传文件似乎没有解决方案,所以必须使用回调进行改造。
//Api interface interface UploadFileApiKotlin { @Multipart @POST("/uploadFileApi") fun uploadFiles( @Part listUri: List<MultipartBody.Part> ): Call<Response<List<FileResponse>?>> } //ViewModel class serviceScope.launch { //Insert into db repository.insertNewExtAct() //Send data into server. val call = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList) call.enqueue(object : Callback<Response<List<FileResponse>?>> { override fun onResponse( call: Call<Response<List<FileResponse>?>>, response: Response<Response<List<FileResponse>?>> ) { TODO("Not yet implemented") } override fun onFailure( call: Call<Response<List<FileResponse>?>>, t: Throwable ) { TODO("Not yet implemented") } }) //Wait for response from server and do logic }我的问题是:如何挂起协程的执行以等待Retrofit的回调?
谢谢你兄弟。 [1]:Upload file/image into server using Coroutine + Retrofit
推荐答案您可以使用suspendCoroutine或suspendCancellableCoroutine处理回调:
serviceScope.launch { //Insert into db repository.insertNewExtAct() //Send data into server. uploadFile() //Wait for response from server and do logic } suspend fun uploadFile() = suspendCoroutine<Response<List<FileResponse>?>> { continuation -> val call = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList) call.enqueue(object : Callback<Response<List<FileResponse>?>> { override fun onResponse( call: Call<Response<List<FileResponse>?>>, response: Response<Response<List<FileResponse>?>> ) { // Resume coroutine with a value provided by the callback continuation.resumeWith(response.data) } override fun onFailure( call: Call<Response<List<FileResponse>?>>, t: Throwable ) { continuation.resumeWithException(t) } }) }suspendCoroutine挂起它执行的协程,直到我们决定通过调用适当的方法继续-Continuation.resume...。suspendCoroutine主要用于我们有一些带有回调的旧代码。
还有suspendCancellableCoroutine生成器函数,它的行为类似于suspendCoroutine,但有额外的功能-提供CancellableContinuation对块的实现。
更多推荐
暂停执行协程以等待回调
发布评论