You need to enable JavaScript to run this app. 如何在Android中使用Hilt为两个不同请求地址创建网络模块
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 22:36:03