回顾 Android「网络通讯」—— 利用反射|青训营笔记

181 阅读2分钟

回顾Android「网络通讯」—— 利用反射

这是我参与「第四届青训营 」笔记创作活动的的第3天

在经过一段时间的实战之后,如今在回顾一下之前在第四届字节青训营学习的数据存储 & 网络通信会有什么样的收获呢?

1、框架对比

img

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

image.png

3、反射拿到不同API属于的类(既然前面提到反射,那就接着骚一下)

思路:通过反射对于文件夹下所有类,在遍历类类中 对象 以及 值 存入整体存入Map中,最后在拦截器中找对呀值即可。

image.png

6、缺陷

a、如果某天别人接手了代码,修给了Url中的类名没有及时修改拦截器就会出现问题

b、如果接口的数量上去可能会造成性能损耗

萌新初学,大佬若有更好的方案欢迎评论区留言