Search code examples
androidretrofit2kotlin-coroutines

Kotlin coroutines, retrofit, android


I am trying do request to Spotify API and at first I need authorization token for getting some info, so i am getting token and after this i try to request some albums with this token, but the second request starts before the first one and i am passing empty token and after get it. What can I do?

Here's my code:

viewModelScope.launch {

        networkUiState = try {
            val networkMusicRepository = NetworkMusicRepository()
            getSpotifyToken(networkMusicRepository)
            val listResult = networkMusicRepository.getAlbums(NetworkUiState.token)

            NetworkUiState.Success
        } catch (e: IOException) {
            Log.d("RESPONSE", e.message.toString())
            NetworkUiState.Error
        } catch (e: HttpException) {
            Log.d("RESPONSE", e.response()?.errorBody()?.string().toString())
            NetworkUiState.Error
        }
    }

And getting token function:

private suspend fun getSpotifyToken(networkMusicRepository: 
NetworkMusicRepository) {
        val responseCall = networkMusicRepository.getToken()
        responseCall.enqueue(object : Callback<TokenResponse> {
        override fun onResponse(
            call: Call<TokenResponse>,
            response: Response<TokenResponse>
        ) {
            val responseBody = response.body()
            if (responseBody != null) {
                val token = responseBody.accessToken
                Log.i("RESPONSE", responseBody.accessToken)

                NetworkUiState.token = token
            } else {
                Log.i("RESPONSE", "null response body")
            }
        }
        override fun onFailure(call: Call<TokenResponse>, t: Throwable) {
            Log.e("RESPONSE", t.message.toString())
        }
    })
}

Solution

  • Make sure you mark all asynchronous methods with suspend for example if getSpotifyToken(networkMusicRepository) is asynchronous

    suspend fun getSpotifyToken(networkMusicRepository: MusicRepository)
    

    What does your retrofit interface look like?