kotlin, как поделиться общим кодом обработчика ответа - PullRequest
0 голосов
/ 15 января 2019

Наличие кода для получения от двух разных конечных точек, но ответ json имеет одинаковую схему, а код обработчика ответа одинаков.

internal interface DataApi {
    @GET("/api/api_1")
    fun getData_1(@QueryMap params: Map<String, String>?): Call<DataMpdel>


    @GET("/api/api_2")
    fun getData_2(@QueryMap params: Map<String, String>?): Call<DataMpdel>
}

private lateinit var dataApi: DataApi

init {
    dataApi = createDataApi()
}

private fun createDataApi() : DataApi {
    val restAdapter = Retrofit.Builder()
            .baseUrl(baseUrl)
            .client(okHttpClient)
            .addConverterFactory(getGsonConverterFactory())
            .build()
    return restAdapter.create(DataApi::class.java)
}

Можно использовать if / else для вызова другой конечной точки, но это будет дублировать код обработчика.

Обновление: создать функцию-обработчик и в обоих onResposne () просто вызвать эту функцию.

Любое предложение, чтобы быть лучше с общим кодом обработчика?

private fun fetchFirst(){

    if (!UseDataApi_1) {
        //
        dataApi. getData_1(getQueryParams()).enqueue(object : Callback<DataModel> {
            override fun onResponse(call: Call<DataModel>?, response: Response<DataModel>?) {

              // same handler code 
            }

            override fun onFailure(call: Call<DataModel>?, throwable: Throwable?) {

      // same error handler code 

            }
        })
    } else {
        //
        dataApi. getData_1(getQueryParams()).enqueue(object : Callback<DataModel> {
            override fun onResponse(call: Call<DataModel>?, response: Response<DataModel>?) {

              // same handler code 
            }

            override fun onFailure(call: Call<DataModel>?, throwable: Throwable?) {

      // same error handler code

            }
        }) 
    }
}

1 Ответ

0 голосов
/ 16 января 2019

Если вы хотите минимизировать дублирующийся код, создайте обратный вызов как объект класса и используйте его для обоих вызовов (что-то вроде этого):

private val callback = object : Callback<DataModel> {
   override fun onResponse(call: Call<DataModel>?, response: Response<DataModel>?) {
       // handler code 
   }

   override fun onFailure(call: Call<DataModel>?, throwable: Throwable?) {
       // error handler code 
   }
}

private fun fetchFirst() {
    if (UseDataApi_1) {
        dataApi.getData_1(getQueryParams()).enqueue(callback)
    } else {
        dataApi.getData_2(getQueryParams()).enqueue(callback)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...