一、虚拟机网络请求始终出问题
这个问题已经确定好了,就是虚拟机的网络出现了问题,好像是ip地址不一样什么的,重置一下虚拟机即可解决
java.net.UnknownHostException: Unable to resolve host "www.example.com": No address associated with hostname
二、对于不标准json数据进行处理
参考博客链接:https://blog.csdn.net/w525721508/article/details/78018207?spm=1001.2014.3001.5506
由于服务器返回的不是标准的json数据,需要对字符串进行切割,但是retrofit封装的太好了,导致无法获取原始数据
这个最终采用重写retrofit封装的三个类来进行了一个实现,不过难度不是很大,就是找原始数据的时候头疼
采取网络上的做法重写转换库,并且添加自己处理字符串的逻辑
这边贴一下代码
DecodeConverterFactory.java
public class DecodeConverterFactory extends Converter.Factory {
public static DecodeConverterFactory create() {
return create(new Gson());
}
public static DecodeConverterFactory create(Gson gson) {
return new DecodeConverterFactory(gson);
}
private final Gson gson;
private DecodeConverterFactory(Gson gson) {
if (gson == null) {
throw new NullPointerException("gson == null");
}
this.gson = gson;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new DecodeResponseBodyConverter<>(adapter);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new DecodeRequestBodyConverter<>(gson, adapter);
}
}
DecodeRequestBodyConverter.java
public class DecodeRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
private static final Charset UTF_8 = Charset.forName("UTF-8");
private final Gson gson;
private final TypeAdapter<T> adapter;
DecodeRequestBodyConverter(Gson gson,TypeAdapter<T> adapter){
this.gson = gson;
this.adapter = adapter;
}
@Override
public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(),UTF_8);
JsonWriter jsonWriter = gson.newJsonWriter(writer);
adapter.write(jsonWriter,value);
jsonWriter.flush();
return RequestBody.create(MEDIA_TYPE,buffer.readByteString());
}
}
DecodeResponseBodyConverter.java
这个类就是要具体修改逻辑的类
其他两个基本上就是源码
public class DecodeResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final TypeAdapter<T> adapter;
DecodeResponseBodyConverter(TypeAdapter<T> adapter) {
this.adapter = adapter;
}
@Override
public T convert(ResponseBody value) throws IOException {
/**
* 这里对服务器返回的原始数据进行处理
* 这里的temp就是原始数据,可以对其做一些操作
*/
String temp = new String(value.bytes(), "utf-8");
return adapter.fromJson(temp);
}
}
然后在构建retrofit时进行替换
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(DecodeConverterFactory.create())
.build()
三、调试过程的一个bug,recyclerView出问题了
E/RecyclerView: No adapter attached; skipping layout
昨天测试的时候还没问题,刚刚一跑又出问题了
哈哈哈,主Activity的layout设置错了,设成了测试的界面,没有能响应界面的activity,所以导致了这种情况
四、git回退版本
当时想看问题出在哪的时候找的
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit的sha码
五、动态替换retrofit的url
待处理,如果有好的想法,评论区留言交流哦
六、动态替换json数据的处理方式
待处理,如果有好的想法,评论区留言交流哦
这个就是上面那个切割json数据的后续