Simple example with Retrofit Gson and Enum types in Android

The dependencies for this example:

implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'

We will retrieve a list of clothes, with each cloth containing a string and an enum type. Here are the data models.
Cloth.kt

data class Cloth (
    @SerializedName("size") val clothSize : ClothSize,
    @SerializedName("cloth") val cloth : String
)

ColthSize.kt

enum class ClothSize {
    SMALL,
    MEDIUM,
    LARGE
}

The Retrofit api client for fetching the list of clothes from the internet.
ApiClient.kt

import retrofit2.Call
import retrofit2.http.GET

interface ApiClient {
    // https://api.jsonbin.io/b/5cad463a4b652413968069a2
    // https://api.myjson.com/bins/17n6pk
    @GET("bins/17n6pk")
    fun getClothes(): Call>
}

The utility class for creating Retrofit instance. RestUtil.kt

import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class RestUtil private constructor() {
    private val API_BASE_URL = "https://api.myjson.com/"
//    private val API_BASE_URL = "https://api.jsonbin.io/"
    val retrofit: Retrofit

    init {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val httpClient = OkHttpClient.Builder().addInterceptor(interceptor).build()

        val builder = Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
        retrofit = builder.client(httpClient).build()
    }

    companion object {
        private var self: RestUtil? = null

        val instance: RestUtil
            get() {
                if (self == null) {
                    synchronized(RestUtil::class.java) {
                        if (self == null) {
                            self = RestUtil()
                        }
                    }
                }
                return self!!
            }
    }
}

Finally, the activity class for putting all of the above together and get the list of clothes from an url.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fab.setOnClickListener {
            fetchClothes()
        }

    }

    private fun fetchClothes() {
        tv_clothes.text = ""

        val client = RestUtil.instance.retrofit.create(ApiClient::class.java)
        val call = client.getClothes()
        call.enqueue(object : Callback> {
            override fun onResponse(call: Call>, response: Response>) {
                if (response.body() != null) {

                    val clothes = response.body()
                    var stringBuilder = StringBuilder("")
                    clothes?.forEach {
                        stringBuilder.append(it.cloth)
                        stringBuilder.append(" ")
                        stringBuilder.append(it.clothSize)
                        stringBuilder.append("\n")
                    }

                    tv_clothes.text = stringBuilder.toString()
                }
            }
            override fun onFailure(call: Call>, t: Throwable) {
                t.printStackTrace()
            }
        })
    }

}

Don’t forget to add the internet permission in the manifest file.


Complete example in Github

Search within Codexpedia

Custom Search

Search the entire web

Custom Search