代码之家  ›  专栏  ›  技术社区  ›  lannyf

Kotlin如何共享常见的改装响应处理程序代码

  •  1
  • lannyf  · 技术社区  · 7 年前

    让代码从两个不同的端点获取,但是响应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 回复  |  直到 7 年前
        1
  •  1
  •   jt-gilkeson    7 年前

    如果要最小化重复代码,请将回调创建为类对象,并将其用于两个调用(类似于此):

    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)
        }
    }