回顾Android「网络通讯」—— 利用反射
这是我参与「第四届青训营 」笔记创作活动的的第3天
在经过一段时间的实战之后,如今在回顾一下之前在第四届字节青训营学习的数据存储 & 网络通信会有什么样的收获呢?
1、框架对比
2、熟悉用法
本次选取了热门的Retrofit2来使用,主要想体验一下Android中的注射反射(平时写Flutter,大家悉知dart是禁用反射的)
3、基本用法
在字节青训营的学习资料中已经详细介绍参考Android 客户端专场 学习资料二
4、实战落地
在一开始封装的时候按照惯性思维写一个Util然后分层,但是在思考android的反射,应该没有简单,在茶学了一些资料之后学习到了Hilt这个工具,那可是十分方便呀
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(HttpRequestInterceptor())
.build()
}
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
return Retrofit.Builder()
.client(okHttpClient)
.baseUrl("https://XXX")
.addConverterFactory(MoshiConverterFactory.create())
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
.build()
}
@Provides
@Singleton
fun provideDyService(retrofit: Retrofit): DyService {
return retrofit.create(DyService::class.java)
}
@Provides
@Singleton
fun provideDyClient(dyService: DyService): DyClient {
return DyClient(dyService)
}
}
注解一下直接帮我们单例并且初始化完成了,只能直呼太骚了!
准备吭哧吭哧的开始写网络请求了,@GET @POST写了两天之后遇到了一个新的问题!
5、问题
场景:接口A和接口B都需要的是不同的Token,传入的参数都是header[token],无法从链接或者参数中区分
思考:不能写一个API就传入一个吧,能不能直接给他分类呢?
在几经波折之后,查阅资料以及求助大佬(@老八秘制小汉堡),得到了如下的解决方案:
1、通过两个类需要不同的API区分开
2、在拦截器中区分插入Token
3、反射拿到不同API属于的类(既然前面提到反射,那就接着骚一下)
思路:通过反射对于文件夹下所有类,在遍历类类中 对象 以及 值 存入整体存入Map中,最后在拦截器中找对呀值即可。
6、缺陷
a、如果某天别人接手了代码,修给了Url中的类名没有及时修改拦截器就会出现问题
b、如果接口的数量上去可能会造成性能损耗
萌新初学,大佬若有更好的方案欢迎评论区留言