Android问题汇总(遥远的回忆过去)

Android-Retrofit-IllegalStateExc

2019-08-07  本文已影响2人  MonkeyLei

再封装Rx数据预和异常预处理的时候,由于为了简便性,我的DataModel字段会包含一些Json字符串没有的字段,这样就导致了JSON解析报错。大概错误就是:

image

还搞得内存溢出了哟!如果去网上查相关问题不一定有这个答案。或许某些问题可以找到。 后来跟网友讨论下,当时说如果是缺少字段可以,但是如果新增了字段而Json字符串有没有该字段就不行。

然后我果断就替换为了阿里的FastJson,FastJson内部做了类似的处理,所以没有问题。简单记录下,后面看看实体类是否还可以进行二次封装,尽量都可以用。

FastJson自定义解析器如下三个文件:

FastJsonConverterFactory.java

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public class FastJsonConverterFactory extends Converter.Factory{

    public static FastJsonConverterFactory create() {
        return new FastJsonConverterFactory();
    }

    /**
     * 需要重写父类中responseBodyConverter,该方法用来转换服务器返回数据
     */
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        return new FastJsonResponseBodyConverter<>(type);
    }

    /**
     * 需要重写父类中responseBodyConverter,该方法用来转换发送给服务器的数据
     */
    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        return new FastJsonRequestBodyConverter<>();
    }
}

FastJsonResponseBodyConverter.java

import com.alibaba.fastjson.JSON;

import java.io.IOException;
import java.lang.reflect.Type;

import okhttp3.ResponseBody;
import okio.BufferedSource;
import okio.Okio;
import retrofit2.Converter;

public class FastJsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
    private final Type type;

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

    /*
     * 转换方法
     */
    @Override
    public T convert(ResponseBody value) throws IOException {
        BufferedSource bufferedSource = Okio.buffer(value.source());
        String tempStr = bufferedSource.readUtf8();
        bufferedSource.close();
        return JSON.parseObject(tempStr, type);
    }
}

FastJsonRequestBodyConverter.java

import com.alibaba.fastjson.JSON;

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.RequestBody;
import retrofit2.Converter;

public class FastJsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");

    @Override
    public RequestBody convert(T value) throws IOException {
        return RequestBody.create(MEDIA_TYPE, JSON.toJSONBytes(value));
    }
}

使用就简单:

image

基本就可以了。测试了也没有问题...其实有时候我们的同一个接口根据参数值不同可能结果会不同,所以基本上我们还是定义一个datamodel比较方便,如果定义多个的话,还得自己去处理JSON数据,感觉更麻烦了。所以目前小白看还是这种比较方便。

上一篇下一篇

猜你喜欢

热点阅读