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

在ViewModel中通过依赖传递Context是否安全?是否会引发内存泄漏?

问题场景

我正在向ViewModel中传入需要依赖Context的SessionManager作为依赖项,代码示例如下:

val viewModel = ViewModelProvider(this, ListingsViewModelFactory(
        ListingsModel(1),
        SessionManager(
            requireContext(), // <===== HERE
            JsonEncoder(),
            JsonDecoder()),
        Validator(),
        WebService(),
        JsonEncoder(),
        JsonDecoder()
    )
    ).get(ListingsViewModel::class.java)

我们知道直接向ViewModel传递Context是会引发内存泄漏的不良实践,因此有以下两个问题:

  1. 是否可以像当前这样,在ViewModel的依赖(如SessionManager)中传递Context?
  2. 在ViewModel的依赖中传递Context是否会引发内存泄漏?

问题解答

1. 是否可以像当前这样传递Context?

不建议直接传递requireContext()(Fragment/Activity级别的Context)。如果SessionManager必须依赖Context,应该传递Application Context(通过requireContext().applicationContext获取)。

Application Context的生命周期与整个应用绑定,不会随Activity/Fragment的销毁而回收,是安全的依赖对象。直接传递Fragment/Activity的Context会带来内存泄漏风险,属于不良实践。

2. 是否会引发内存泄漏?

这取决于你传递的Context类型:

  • 如果是Fragment/Activity的Context(当前代码中的requireContext()):肯定会引发内存泄漏。ViewModel的生命周期独立于Fragment/Activity,比如屏幕旋转后旧Activity会被销毁,但ViewModel会保留。此时SessionManager持有旧Activity的引用,导致该Activity无法被GC回收,造成内存泄漏。
  • 如果是Application Context:不会引发内存泄漏。Application Context的生命周期和应用一致,ViewModel持有它的引用不会影响任何组件的正常回收。

额外建议

  • 先确认SessionManager是否真的需要Context,如果只是操作SharedPreferences、全局资源等,Application Context完全能满足需求。
  • 推荐使用依赖注入框架(如Hilt)管理SessionManager这类全局依赖,让框架自动注入Application Context,减少手动传递出错的概率。

内容的提问来源于stack exchange,提问作者Umair Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:01:17