Search code examples
androidretrofit2kotlin-coroutines

Upload file/image into server using Coroutine + Retrofit


I am new coroutines I try to upload file into server (using Retrofit 2.9.0) but I didn't get the response. Below is my code:

private suspend fun uploadFile(inputFiles: List<String>,channel:Channel<Any>): List<FileResponse>? {
        val partList = buildFilePart(inputFiles)
        QLog.d(TAG,"uploadFile going 1")
        val response = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList)
        QLog.d(TAG,"uploadFile going 2")
        return response.body()
}
interface UploadFileApiKotlin {
    @Multipart
    @POST("/uploadFile")
    suspend fun uploadFiles(
        @Part listUri: List<MultipartBody.Part>
    ): Response<List<FileResponse>?>
}

After checking logcat, I saw only one line of code:

uploadFile going 1

There is no log line: uploadFile going 2

It seems that coroutine is suspended at line : val response = RequestHelper.getUpLoadFilesKotlinRequest().uploadFiles(partList)

How can I resolve this problem?


Solution

  • I posted another question and finally I got the answer for myself

    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)
            }
        })
    }