CJ_rui 2022-04-21 14:01 采纳率: 100%
浏览 25
已结题

kotlin接口回调 安卓, 只有一个方法,却用不了lambdm表达式,如何解决?

问题相关代码 kotlin上手好难 = - =
HttpUtil.get(
            "/prod-api/api/rotation/list",
            mapOf(),
            KJbanner::class.java,
            object : HttpUtil.Callback<KJbanner> {
                override fun callback(json: String, t: KJbanner) {

                }
            })
这是我的工具类

object HttpUtil {
    private val gson = Gson()
    fun <T> get(
        url: String,
        query: Map<String, String>,
        clazz: Class<T>,
        callback: Callback<T>
    ) {
        val bodyCall = api.get(url, header, query)
        enqueue(bodyCall, clazz, callback)
    }

    private fun <T> enqueue(
        bodyCall: Call<ResponseBody>,
        clazz: Class<T>,
        callback: Callback<T>
    ) {
        bodyCall.enqueue(object : retrofit2.Callback<ResponseBody> {
            override fun onFailure(p0: Call<ResponseBody>, p1: Throwable) {
                Log.d(clazz.name, "网络请求错误$p1")
            }

            override fun onResponse(p0: Call<ResponseBody>, p1: Response<ResponseBody>) {
                val json = p1.body()!!.string()
                val t = gson.fromJson(json, clazz)
                Log.i(clazz.name, "onResponse: $json")
                callback.callback(json, t)
            }
        })
    }

    interface Callback<T> {
        fun callback(json: String, t: T)
    }
    private val header: Map<String, String>
        get() {
            val map = HashMap<String, String>()
            if (DataUtil.token != null) {
                map["Authorization"] = DataUtil.token!!
            }
            return map
        }
    private val api: Api = Retrofit.Builder().baseUrl(DataUtil.url).build().create(Api::class.java)


    private interface Api {
        @GET
        fun get(
            @Url string: String,
            @HeaderMap header: Map<String, String>?,
            @QueryMap query: Map<String, String>
        ): Call<ResponseBody>
    }
}
我的解答思路和尝试过的方法
我想要达到的结果 : 当我用java写的工具类时

HttpUtil.get("/sc2/lib/comment/list", mapOf, KJlibcomments::class.java) { json, t ->
           
 
        }


public class HttpUtil {

    private static Gson gson = new Gson();

    public static <T> void get(String address, Map<String, String> query, Class<T> cls, Callback<T> callback) {
        if (query == null) query = new HashMap<>();
        Call<ResponseBody> bodyCall = getApi().get(DataUtil.url + address, getHead(), query);
        enqueue(bodyCall, cls, callback);
    }



    private static <T> void enqueue(Call<ResponseBody> bodyCall, final Class<T> cls, final Callback<T> callback) {
        bodyCall.enqueue(new retrofit2.Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String json = response.body().string();
                    Log.d(cls.getName() + "json", "onResponse: " + json);
                    T t = gson.fromJson(json, cls);
                    callback.callback(json, t);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable throwable) {
                Log.d(cls.getName(), "网络请求错误" + throwable.toString());
            }
        });
    }


    private static Map<String, String> getHead() {
        HashMap<String, String> map = new HashMap<>();
        if (DataUtil.token != null) map.put("Authorization", DataUtil.token);
        return map;
    }

    private static Api getApi() {
        Retrofit retrofit = new Retrofit.Builder().baseUrl(DataUtil.url).build();
        return retrofit.create(Api.class);
    }

    public interface Callback<T> {
        void callback(String json, T t);
    }

    interface Api {
        @GET
        Call<ResponseBody> get(@Url String url, @HeaderMap Map<String, String> header, @QueryMap Map<String, String> query);

   
}

  • 写回答

1条回答 默认 最新

  • 立青_ 2022-04-21 14:38
    关注

    用kotlin的话,其实没必要再定义Callback这个回调接口了
    你可以这么定义get方法

     fun <T> get(
            url: String,
            query: Map<String, String>,
            clazz: Class<T>,
            callback: (json: String, t: T) -> Unit
        ){
            
        }
    
    

    然后这么调用

     get("", map,String::class.java){
                    json,t->{
    
                  }
                }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月21日

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错