Retrofit with Kotlin Coroutines

amitiitbhu

Amit Shekhar

Posted on October 9, 2022

Retrofit with Kotlin Coroutines

Hi, I am Amit Shekhar, Co-Founder @ Outcome School • IIT 2010-14 • I have taught and mentored many developers, and their efforts landed them high-paying tech jobs, helped many tech companies in solving their unique problems, and created many open-source libraries being used by top companies. I am passionate about sharing knowledge through open-source, blogs, and videos.

In this blog, we will learn how to use Retrofit with Kotlin Coroutines in Android. We will learn to write the code inside the ViewModel with Kotlin Coroutines that follows a basic MVVM Architecture.

This article was originally published at Outcome School.

I will be using the following project for the implementation part. The project follows a basic MVVM Architecture for simplicity. You can find the complete code for the implementation mentioned in this blog in the project itself.

GitHub Project: Learn Kotlin Coroutines

First, we need to set up our dependencies for the Retrofit as below:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
Enter fullscreen mode Exit fullscreen mode

Note: Always check for the latest available version.

As I am using the Gson to parse JSON into Java and Kotlin classes, I have added the dependency for the Gson. You can add based on your requirement.

Now, create the data class ApiUser as below:

data class ApiUser(
    @SerializedName("id")
    val id: Int = 0,
    @SerializedName("name")
    val name: String = "",
    @SerializedName("email")
    val email: String = "",
    @SerializedName("avatar")
    val avatar: String = ""
)
Enter fullscreen mode Exit fullscreen mode

Now, we need to create the ApiService interface required for Retrofit.

interface ApiService {

    @GET("users")
    suspend fun getUsers(): List<ApiUser>

    @GET("more-users")
    suspend fun getMoreUsers(): List<ApiUser>

    @GET("error")
    suspend fun getUsersWithError(): List<ApiUser>

}
Enter fullscreen mode Exit fullscreen mode

Note: We have used suspend keyword to support Coroutines so that we can call it from a Coroutine or another suspend function.

After this, we will be needing a class RetrofitBuilder which will be a Singleton.

object RetrofitBuilder {

    private const val BASE_URL = "https://5e510330f2c0d300147c034c.mockapi.io/"

    private fun getRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    val apiService: ApiService = getRetrofit().create(ApiService::class.java)

}
Enter fullscreen mode Exit fullscreen mode

Then, we will create an interface ApiHelper.

interface ApiHelper {

    suspend fun getUsers(): List<ApiUser>

    suspend fun getMoreUsers(): List<ApiUser>

    suspend fun getUsersWithError(): List<ApiUser>

}
Enter fullscreen mode Exit fullscreen mode

Note: Again, we have used suspend keyword to support Coroutines so that we can call it from a Coroutine or another suspend function.

After that, we will create a class ApiHelperImpl that implements the ApiHelper interface.

class ApiHelperImpl(private val apiService: ApiService) : ApiHelper {

    override suspend fun getUsers() = apiService.getUsers()

    override suspend fun getMoreUsers() = apiService.getMoreUsers()

    override suspend fun getUsersWithError() = apiService.getUsersWithError()

}
Enter fullscreen mode Exit fullscreen mode

Once we've done that, we can create the instance of ApiHelper as below:

val apiHelper = ApiHelperImpl(RetrofitBuilder.apiService)
Enter fullscreen mode Exit fullscreen mode

Finally, we can pass this instance wherever required, for example to the ViewModel, and make the network call to get the users from the network as below:

class SingleNetworkCallViewModel(private val apiHelper: ApiHelper, private val dbHelper: DatabaseHelper) : ViewModel() {

    init {
        fetchUsers()
    }

    private fun fetchUsers() {
        viewModelScope.launch {
            try {
                val usersFromApi = apiHelper.getUsers()
                // list of users from the network
            } catch (e: Exception) {
                // handle exception
            }
        }
    }

}
Enter fullscreen mode Exit fullscreen mode

This way, we are able to fetch the data from the network using Retrofit with Kotlin Coroutines in Android.

I must mention that you can learn much more from the GitHub repository that I mentioned above in this blog. You can learn the following:

  • Making network calls in series using Retrofit with Kotlin Coroutines.
  • Making multiple network calls in parallel using Retrofit with Kotlin Coroutines.

This is how we can use Retrofit with Kotlin Coroutines in Android.

Master Kotlin Coroutines from here: Mastering Kotlin Coroutines

That's it for now.

Thanks

Amit Shekhar

Co-Founder @ Outcome School

You can connect with me on:

Read all of our blogs here.

💖 💪 🙅 🚩
amitiitbhu
Amit Shekhar

Posted on October 9, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related