首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

从零开始实现一个 mini-Retrofit 框架

前言 本篇文章采用循序渐进的编码方式,从零开始实现一个Retorift框架,实现过程不断提出问题并分析实现,最终开发出一个mini版的Retrofit框架 ?...,方法上添加了注解@GET 表示这是一个Http GET请求的调用,注解GET带的默认参数表示GET请求的地址。...paresePost方法我们首先通过Method的getGenericParameterTypes方法获取所有参数的Type类型,并且通过Type类获得参数的原始Class类型,之后就可以使用Gson...3.4 实现ConverterFactory 解耦Json转换 在上面的例子,我们直接在框架Retrofit使用Gson库做Json转换,但作为一个框架来说 我们不希望直接强耦合一个第三方Json...gson; private final TypeAdapter adapter; GsonRequestBodyConverter(Gson gson, TypeAdapter

2K10

Android 序列化框架 Gson 原理分析,可以优化吗?

TypeAdapter 更节省内存,但不方便。不过,如果需要用到完整数据结构(例如根据 type 字段按照不同类型解析 data),也可以手动解析树型结构。...[ 左括号,再用元素类型的 TypeAdapter 依次序列化元素对象,再写入 ] 右括号; 3、反序列化时,先创建集合对象,再用元素类型的 TypeAdapter 依次反序列化元素对象; 4、Map...因此,Gson 的做法是: 1、每次新创建 TypeAdapter 前,先在临时映射表创建一个 FutureTypeAdapter 代理对象。...创建真实的 TypeAdapter 后,将其注入到代理对象。... Gson 的反序列化,首次反序列化一个类型的对象时,Gson 需要使用大量反射调用解析一个 TypeAdapter 适配器对象。随着 Model 的复杂程度增加,首次解析的耗时会不断膨胀。

2.1K50

死磕Java泛型(一篇就够)

类型,这里要明确一点是,这里擦除的只是方法内部的泛型信息,而泛型的元信息还是保存在类的class字节码文件,相信细心的同学已经发现了上面我特意方法的注释一并贴了出来 // signature (Ljava...为了加深对泛型使用的理解,我接下来再看几个小例子。 泛型Gson解析使用 String jsonString = "........,然后通过TypeAdapterjson字符串转化为对象T,中间的细节这里就不继续深入了。...泛型retrofit使用 我们使用retrofit时,一般都会定义一个或多个ApiService接口类 @GET("users/{user}/repos") Call> listRepos...其实有上面的泛型知识以及Gson使用说明,相信大家以及有答案了。 retrofit框架本身设计的很优雅,细节这里我们不深入展开,这里我们只关心泛型数据转换为返回值的过程。

1.2K40

Kotlin结合Rxjava+Retrofit实现极简网络请求的方法

于是我Retrofit中加入了Rxjava,这也是当下蛮流行的一个请求框架。然后又利用了Kotlin的一些新特性,使网络请求变得特别简单,代码量特别少。...Kotlin允许把一个方法当做一个参数进行使用使用时通过Lambda的方式展示,一样我们刚刚写runRx那个文件: fun <T runRxLambda(observable: Observable...{ error(e) } }) } 这里通过next:(T)- Unit方法当做一个参数,其中next这个参数的参数名字,冒号后面的括号里面这个方法需要的参数,多个参数逗号隔开,Unit是返回类型...接下来看看效果: runRxLambda(retrofit().load(),{ //我们在这里的操作就相当于onNext的操作,参数可以通过it获取 },{ //这里就是onError的实现...,参数也可以通过it获取 }) runRxLambda(retrofit().load(),{ //我们在这里的操作就相当于onNext的操作,参数可以通过it获取 },{ //这里就是onError

2.2K30

源码追踪 - Gson解析部分属性值null

原因是项目采用的gson做json解析,gson解析对象json字符串时,对于对象匿名内部类属性,会设Null值。 解决方法是不使用匿名内部类对象。 前端接收数据,实际对象是有值的。...代码com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper,55行 ?...gson如何解析 打印代码执行stack,可以看到gson一层一层解析json逻辑是解析属性,如果属性没有对应解析器,就新建解析对象继续解析,不停递归。递归的类顺序就在下面的堆栈。...at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:234) com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write...$Adapter.write(ReflectiveTypeAdapterFactory.java:243) at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java

1.5K20

人生苦短,我用Gson

JSON 键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键/值对组合的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值,如下例子所示: {“firstName”:... typeAdapter = (TypeAdapter) gson.getAdapter(value.getClass()); if (typeAdapter instanceof...(out, value); } } 看到该逻辑过程,如果Json对应的是Object类型,最终会解析Map 类型;其中Object类型跟Json具体的值有关,比如双引号的””值翻译为STRING...另外一点可以看出当类型BEGIN_OBJECT时ObjectTypeAdapter返回的Gson自定义的map类型LinkedTreeMap,如果使用时用到强转为HashMap会报错,由于我们使用的都是...五、总结 Gson是Google公司发布的一个开放源代码的Java库,主要用途序列化Java对象JSON字符串,或反序列化JSON字符串成Java对象。

2.1K50

Android避坑指南,GsonKotlin碰撞出一个不安全的操作

问题的来源 上周一个群有个小伙伴,遇到了一个Kotlin写的Bean,在做Gson字符串转化成具体的Bean对象时,发生了一个不符合预期的问题。...对于Java Bean,kotlin可以用data class,网上也有很多博客表示: Kotlin ,不需要自己动手去写一个 JavaBean,可以直接使用 DataClass,使用 DataClass...那么只能去看看Gson的源码了: Gson的逻辑,一般都是根据读取到的类型,然后找对应的TypeAdapter去处理,本例Person对象,所以会最终走到ReflectiveTypeAdapterFactory.create...程序过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。...看到这里,大家可能最大的收获就是了解Gson构建对象流程,以及以后写Bean的时候会注意提供默认的无参构造方法,尤其使用Kotlin data class的时候。

1.3K20

Android Gradle依赖管理、去除重复依赖、忽略的方式

常用依赖 //1.直接依赖第三方开源库,一般是托管 jitpack 或者 jcenter implementation 'com.google.code.gson:gson:2.2.4' implementation...去掉重复依赖 1.第三方库同样使用了implementation或者compile依赖相同的库 implementation('com.allenliu.versionchecklib:library...项目开发我们会经常引入多个Module,然而每个Module又包含了V4、V7,为了升级新版本依赖包只用更改一次,我们决定采用Gradle依赖的统一管理,避免重复繁琐的劳动。..." : "com.squareup.retrofit2:retrofit:${version["retrofitVersion"]}", "converter-gson"...使用Gradle依赖管理无法使其生效 testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' renderscriptTargetApi

10.3K31

MVVM框架的搭建(三)——网络请求

module升级更新版本号,请使用 module_[modulename]*的命名规则 * * [project.ext.dependVersion] 创建各个依赖库的版本号控制,需类库名称后增加...‘_version’ * * [类库maven地址] 创建各个类库的maven地址,同一类库需要引用多个类时,可以使用数组,要确保类库引用不重复 * * [项目依赖列表] 创建可以直接让module...引用的依赖列表,以Deps结尾,原则上以类库功能分类,比如网络库,图片处理库 * 尽量不要以类库本身的名字命名依赖列表 * * 各个module引用类库时尽量使用项目依赖列表的项目,不要直接使用类库地址的项目...: "com.squareup.retrofit2:adapter-rxjava2:$dependVersion.retrofit2_version"] gson = [gson: "com.google.code.gson...Kotlin的类,使用比较简单和GsonFromat一样的。

83620
领券