Android-Retrofit-IllegalStateExc

作者: MonkeyLei | 来源:发表于2019-08-07 09:18 被阅读2次

    再封装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数据,感觉更麻烦了。所以目前小白看还是这种比较方便。

    相关文章

      网友评论

        本文标题:Android-Retrofit-IllegalStateExc

        本文链接:https://www.haomeiwen.com/subject/xcundctx.html