retrofit2.0中自定义转换器使用,通用啊

1、自定义转换:
说白了,就是把请求服务器获取的数据转换成自定义的object对象,
比如 Student、Teacher …
通常是转换json数据,
并且已经自带了一些转换器,
默认是

Response<ResponseBody> 
response类型,可以理解成string类型

我的需求是将json数据解析成

List<Data>

public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {}
没有用转换器之前我的代码对返回数据解析:

 call.enqueue(new Callback<ResponseBody>() {

            @Override
            public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
                Log.d("lihui", "123onResponse");
                try {
                    ResponseBody httpResult = response.body();
                    //原始数据下手
                    String result = httpResult.string();
                    org.json.JSONObject jsonObject = new org.json.JSONObject(result);
                    String reason = jsonObject.getString("reason");
                    ToastUtils.setToastText(context, reason);
                    String result2 = jsonObject.getString("result");
                    org.json.JSONObject jsonObject2 = new org.json.JSONObject(result2);
                    String stat = jsonObject2.getString("stat");
                    String data = jsonObject2.getString("data");
                    org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);
                    list.clear();
                    for (int i = 0; i < jsonArray2.length(); i++) {
                        //获取每一个JsonObject对象
                        org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);
                        if (myjObject != null) {
                            Data data1 = new Data(myjObject);
                            Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey());
                            Log.d("lihui", "Fragment onResponse data---" + data1);
                            list.add(data1);
                        }
                    }
                    if (list != null && list.size() > 0 && mHandler != null) {
                        Message msg = mHandler.obtainMessage();
                        msg.what = 0;
                        msg.obj = list;
                        mHandler.sendMessage(msg);
                        empty.setVisibility(View.GONE);
                        cacheMap.put(type, list);
                    }
                    Log.d("lihui", "159 list---" + list);

                } catch (Exception e) {
                    Log.d("lihui", "114e---" + e.getMessage());
                    pullToRefreshRecyclerView.onRefreshComplete();
                }
}

2、添加转换器
就是在返回数据之后,多出一步骤,就是自动转换成你返回的类型。
方法:
1)
修改返回类型接口

public interface  HttpService {

    @POST("toutiao/index")
    Call<List<Data>> getData(@Query("type") String type, @Query("key") String key);
}

2)修改返回类型
retrofit.Call

static class CustomConverterFactory extends Converter.Factory {
        static CustomConverterFactory factory;

        public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
            Log.d("CustomConverterFactory", "type---" + type);
            return new UserResponseConverter(type);
        }

        public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {
            return null;
        }

        public static CustomConverterFactory create() {
            if (factory == null) {
                factory = new CustomConverterFactory();
            }
            return factory;
        }
    }

4)自定义Converter

 public static class UserResponseConverter<T> implements Converter<ResponseBody, T> {
        private Type type;

        public UserResponseConverter(Type type) {
            this.type = type;
        }

        @Override
        public T convert(ResponseBody responseBody) throws IOException {
            List<Data> list = new ArrayList<>();
            //原始数据下手
            String result = responseBody.string();
            //构造1
            try {
                org.json.JSONObject jsonObject = null;
                jsonObject = new org.json.JSONObject(result);
                String reason = jsonObject.getString("reason");
                //  ToastUtils.setToastText(context, reason);
                String result2 = jsonObject.getString("result");
                //构造2
                org.json.JSONObject jsonObject2 = new org.json.JSONObject(result2);
                String stat = jsonObject2.getString("stat");
                String data = jsonObject2.getString("data");
                //构造3
                org.json.JSONArray jsonArray2 = new org.json.JSONArray(data);
                for (int i = 0; i < jsonArray2.length(); i++) {
                    //获取每一个JsonObject对象
                    org.json.JSONObject myjObject = jsonArray2.getJSONObject(i);
                    if (myjObject != null) {
                        Data data1 = new Data(myjObject);
                        Log.d("lihui", "Fragment onResponse getUniquekey---" + data1.getUniquekey());
                        Log.d("lihui", "Fragment onResponse data---" + data1);
                        list.add(data1);
                    }
                }
                Log.d("CustomConverterFactory", "list---" + list);

            } catch (Exception e) {
                e.printStackTrace();
            }
            return (T) list;
        }
    }

5) 构造时候加入自定义转换器

  //1

        Retrofit retrofit = new Retrofit.Builder().
                baseUrl("http://v.juhe.cn/").
                addConverterFactory(CustomConverterFactory.create()).build();

        //2
        HttpService myService = retrofit.create(HttpService.class);
        //3
        retrofit.Call<List<Data>> call = myService.getData(type, "9f3097f4cbe47e8abb01ca3b92e49cda");

6)执行请求时候简单了,直接返回自定义的数据类型

    call.enqueue(new Callback<List<Data>>() {

            @Override
            public void onResponse(Response<List<Data>> response, Retrofit retrofit) {
                Log.d("lihui", "123onResponse");
                try {
                    List<Data> dataList = response.body();
                    Utils.resetList(list, dataList);//交换数据
                    Log.d("CustomConverterFactory", "  Utils.resetList(list, dataList)---" + list);

                    if (list != null && list.size() > 0 && mHandler != null) {
                        Message msg = mHandler.obtainMessage();
                        msg.what = 0;
                        msg.obj = list;
                        mHandler.sendMessage(msg);
                        empty.setVisibility(View.GONE);
                        cacheMap.put(type, list);
                    }
                    Log.d("lihui", "159 list---" + list);

                } catch (Exception e) {
                    Log.d("lihui", "114e---" + e.getMessage());
                    pullToRefreshGridView.onRefreshComplete();
                }
            }

            @Override
            public void onFailure(Throwable t) {
                Log.d("lihui", "165t:" + t.getMessage());
                t.printStackTrace();
                Message msg = mHandler.obtainMessage();
                msg.what = 1;
                msg.obj = type;
                mHandler.sendMessage(msg);
            }

        });

就是这么简单。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值