如何在Android中使用Hilt为两个不同请求地址创建网络模块
使用Hilt实现多路由地址网络模块方案
核心思路是通过Hilt的*限定符(Qualifier)*区分不同路由的网络实例,避免依赖注入冲突,具体实现步骤如下:
第一步:自定义业务区分限定符
首先创建两个注解作为不同路由的标记,用来区分同类型的不同依赖实例:
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class FirstRouteApi @Qualifier @Retention(AnnotationRetention.BINARY) annotation class SecondRouteApi
你可以根据实际业务场景修改注解命名,比如@UserApi、@OrderApi,提升代码可读性。
第二步:编写Hilt网络模块,分别生成两个路由的网络实例
这里以常用的OkHttp+Retrofit组合为例,在Hilt模块中分别配置两个不同baseUrl的网络实例:
@Module @InstallIn(SingletonComponent::class) object NetworkModule { // 第一个路由的OkHttpClient配置,可自定义超时、拦截器等参数 @Provides @FirstRouteApi fun provideFirstOkHttpClient(): OkHttpClient { return OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) // 按需添加该路由专属的拦截器、证书校验等配置 .build() } // 第二个路由的OkHttpClient配置,可和第一个路由的配置完全不同 @Provides @SecondRouteApi fun provideSecondOkHttpClient(): OkHttpClient { return OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) // 按需添加该路由专属的配置 .addInterceptor(AuthHeaderInterceptor()) .build() } // 生成第一个路由对应的Retrofit实例 @Provides @FirstRouteApi fun provideFirstRetrofit(@FirstRouteApi okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl("https://first-route.example.com/") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) // 按需添加CallAdapter等其他配置 .build() } // 生成第二个路由对应的Retrofit实例 @Provides @SecondRouteApi fun provideSecondRetrofit(@SecondRouteApi okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .baseUrl("https://second-route.example.com/") .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build() } // 生成第一个路由的Api Service接口实例 @Provides @FirstRouteApi fun provideFirstApiService(@FirstRouteApi retrofit: Retrofit): FirstRouteApiService { return retrofit.create(FirstRouteApiService::class.java) } // 生成第二个路由的Api Service接口实例 @Provides @SecondRouteApi fun provideSecondApiService(@SecondRouteApi retrofit: Retrofit): SecondRouteApiService { return retrofit.create(SecondRouteApiService::class.java) } }
第三步:注入对应路由的网络实例使用
在需要调用接口的类中,用对应的限定符标记要注入的实例即可:
@HiltViewModel class DataViewModel @Inject constructor( @FirstRouteApi private val firstApi: FirstRouteApiService, @SecondRouteApi private val secondApi: SecondRouteApiService ) : ViewModel() { // 调用第一个路由的接口 suspend fun fetchFirstRouteData() = firstApi.getListData() // 调用第二个路由的接口 suspend fun fetchSecondRouteData() = secondApi.getDetailData() }
注意点
- 如果两个路由的网络配置重合度很高,可以单独抽离公共配置方法,避免重复代码,只在生成两个实例的时候添加差异化配置即可
- 除了Api Service,你也可以直接注入对应限定符标记的Retrofit、OkHttpClient实例使用
内容的提问来源于stack exchange,提问作者Behruz Bahromzoda
相关产品推荐
相关产品推荐

