Android Retrofit访问模块内OkHttpClient取消全部历史API请求
问题原因
你当前使用的是Kotlin依赖注入框架Koin,你定义的appNetworkModule只是Koin的依赖配置规则类,无法直接访问内部初始化的实例:
single代码块内部声明的okHttpClient是局部变量,作用域仅局限于初始化闭包,不会作为appNetworkModule的公开属性暴露- Koin的
module仅用来声明依赖的创建逻辑,生成的实例统一存在Koin容器中,需要通过Koin提供的API检索获取,不能直接通过模块对象访问
解决方案
步骤1:规范OkHttpClient依赖声明
修改模块配置,你可以按需给依赖添加命名(如果项目中有多个OkHttpClient实例必须加,单个实例可以省略):
val appNetworkModule = module { // 可选添加named标注区分同类型实例 single<OkHttpClient>(named("APP_OKHTTP_CLIENT")) { OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .addInterceptor(get<Interceptor>(named("LOGGING_INTERCEPTOR"))) .addInterceptor(get<Interceptor>(named("OK_HTTP_INTERCEPTOR"))) .build() } }
步骤2:从Koin容器中获取实例执行取消操作
在主Activity的登出逻辑处,通过Koin的API获取OkHttpClient实例后再调用取消方法:
你可以选择提前懒注入实例:
// 在Activity类中提前声明注入 private val okHttpClient: OkHttpClient by inject(named("APP_OKHTTP_CLIENT")) // 登出时直接调用 okHttpClient.dispatcher.cancelAll() // 可选:清空连接池释放闲置连接 okHttpClient.connectionPool.evictAll()
也可以在需要时实时获取实例:
val okHttpClient = get<OkHttpClient>(named("APP_OKHTTP_CLIENT")) okHttpClient.dispatcher.cancelAll()
注意:如果你的请求是配合协程发起的,建议同时取消对应业务域的协程作用域,避免后续出现状态异常
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

