0

I have an interface to generate the concrete Retrofit client class, like this:

interface SyncService {

    @GET("event/sampleValue")
    fun currentEvent(): Call<CurrentEventResponse>

    @GET("event")
    fun getEvents(): Call<List<EventResponse>>

    @POST("Answer")
    fun sendAnswers(@Body requests: Array<AnswerRequest>): Call<SendAnswerResponse>
}

Then I need to enqueue calls to currentEvent() and getEvents() in my ViewModel class:

class SettingsViewModel(
        application: Application,
        ) : AndroidViewModel(application), Callback<List<EventResponse>> {

// ...

    private fun getEvents() {
        ApiClient.syncService().getEvents().enqueue(this)
    }


    fun getCurrentEventData() {
        ApiClient.syncService().currentEvent().enqueue(this)
    }

    /**
     * Failure event handler for the getEvents API request.
     */
    override fun onFailure(call: Call<List<EventResponse>>, t: Throwable) {
        LOGE(TAG, "getEvents API request failed.", t)
    }

    /**
     * Response event handler for the getEvents API request.
     */
    override fun onResponse(call: Call<List<EventResponse>>, response: Response<List<EventResponse>>) {
        if (response.isSuccessful) {
            response.body()?.let { events.addAll(it) }
        }
    }

}

The problem here is that I can't make SettingsViewModel class implement both Callback<List<EventResponse>> and Callback<CurrentEventResponse> as it claims that the JVM signature is the same.

One option would be create the callback object inline, like:

fun getCurrentEventData() {
    ApiClient.syncService().currentEvent().enqueue(object : Callback<CurrentEventResponse> {
        override fun onFailure(call: Call<CurrentEventResponse>, t: Throwable) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }

        override fun onResponse(call: Call<CurrentEventResponse>, response: Response<CurrentEventResponse>) {
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        }
    })
}

But I'd like to separate the event handlers, so the calling method (getCurrentEventData()) does not grow with the logic for the onResponse and onFailure events.

What else can I do?

juliano.net
  • 7,982
  • 13
  • 70
  • 164
  • 1
    JVM signature is the same due to type erasure. Why not create 1 object of inner class for each callback type and use them, instead of creating new anonymous instances? – Pawel Sep 21 '18 at 14:17
  • take a look at: https://stackoverflow.com/questions/1297972/how-to-make-a-java-class-that-implements-one-interface-with-two-generic-types – Mosius Sep 21 '18 at 14:26

0 Answers0