Using Coroutine runblock with the Authenticator to handle 401 response from retrofit

前端 未结 1 773
既然无缘
既然无缘 2021-01-14 03:34

I am trying to use the Authenticator to handle 401 response. What I have done is

fun provideAccessTokenAuthenticator(
    mainApiServiceHolder: MainApiService         


        
相关标签:
1条回答
  • 2021-01-14 03:59

    In the Retrofit API, consider replacing your async runBlocking{} suspend fun with a synchronous Call. I had the most luck avoiding the use of coroutines inside the Authenticator.

    I was having the same problem. The token request went straight into a black hole. The app freezed. The request was never seen again. No error, no nothing.

    But everywhere else in the app, the suspend fun came back just fine. From ViewModels, from WorkManager, it worked every time. But from the Authenticator, never. What was wrong with the Authenticator? What was special about the Authenticator that made it act this way?

    Then I replaced the runBlocking{} coroutine with a straightforward Call. This time, the request came back and the token arrived without a fuss.

    The way I got the API to work looked like this:

    @FormUrlEncoded
    @POST("token")
    fun refreshTokenSync(
        @Field("refresh_token") refreshToken: String,
    ): Call<RefreshMyTokenResponse>
    

    Then, in the Authenticator:

     val call = API.refreshTokenSync(refreshToken)
     val response = call.execute().body()
    

    I hope this helps someone else who ran into the same issue. You may receive a warning from Android Studio that this is an inappropriate blocking call. Don't pay it any nevermind.

    0 讨论(0)
提交回复
热议问题