You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:09:00