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);
}
});
就是这么简单。。。