第一阶段开发遇到的问题

简介: 这个问题已经确定好了,就是虚拟机的网络出现了问题,好像是ip地址不一样什么的,重置一下虚拟机即可解决

一、虚拟机网络请求始终出问题

这个问题已经确定好了,就是虚拟机的网络出现了问题,好像是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数据的后续

目录
相关文章
|
15天前
|
Java Spring
什么是WebFlux
Spring WebFlux 是 Spring Framework 5 引入的响应式Web框架,支持非阻塞、事件驱动的编程模型,适用于高并发场景,可运行于 Netty、Undertow 等服务器,提供注解式和函数式编程接口。
59 2
|
8月前
|
XML 数据库 Android开发
Android数据库的使用(增删改查)
本文介绍了一个简单的数据库操作Demo,包含创建数据库、增删改查功能。通过5个按钮分别实现创建数据库、插入数据、删除数据、更新数据和查询数据的操作。代码结构清晰,适合初学者学习Android SQLite数据库基础操作。
252 5
|
Android开发
HBuilder X连接雷电模拟器(手机模拟器)
HBuilder X连接雷电模拟器(手机模拟器)
HBuilder X连接雷电模拟器(手机模拟器)
|
缓存
【POI】导出xls文件报错:The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
使用POI导出xls文件,由于数据过多,导致导出xls报错如下: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook   原因: 代码中创建 HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle(); 次数过多,导致报错。
7065 0
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
451 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
存储 JSON NoSQL
MongoDB入门-MongDB介绍和安装
MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2102 1
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
1949 1
|
前端开发 JavaScript API
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
【8月更文挑战第17天】赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
791 3
赶快收藏!全网最佳websocket封装:完美支持断网重连、自动心跳!
|
Java API Maven
SpringBoot+SeetaFace6搭建人脸识别平台
【10月更文挑战第8天】以下是使用Spring Boot和SeetaFace6搭建人脸识别平台的步骤:首先安装Java和Maven,下载SeetaFace6库并添加依赖;接着创建Spring Boot项目并在`pom.xml`中添加必要依赖;然后配置SeetaFace6参数;实现人脸识别服务类与控制器类;最后使用工具如Postman测试API接口及识别结果。示例代码展示了如何接收图像数据并进行人脸检测。可根据具体需求扩展更多功能,如用户管理和历史记录等。
1073 1
|
机器学习/深度学习 人工智能 程序员
代码之美:我的编程旅程
在数字化时代的浪潮中,编程已成为一种全新的艺术形式。本文将通过个人的技术感悟,探索编程之美的多重维度,从解决问题的成就感,到代码结构的优雅,再到技术社区的温暖,每一方面都是对编程艺术的深刻理解。文章旨在鼓励更多的编程爱好者,以创造性和批判性的眼光,重新审视并欣赏编程这一现代魔法。
148 28