news 2026/4/22 16:20:28

Android 架构进化之路:为何在 Retrofit + 协程重构中,我们需要引入 Hilt?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 架构进化之路:为何在 Retrofit + 协程重构中,我们需要引入 Hilt?

它是理性、技术导向且务实的。

文章的策略不是“为了用框架而用框架”,而是从痛点出发(手动写 Factory 的繁琐、SavedStateHandle 的难搞、Compose 的未来),最后通过对比得出结论。

Android 架构进化之路:为何在 Retrofit + 协程重构中,我们需要引入 Hilt?

背景

目前我们的项目正在进行现代化的架构升级:

  1. 网络层:从 RxJava 迁移到Kotlin Coroutines+Retrofit
  2. 数据流:使用Flow和密封类 (NetworkResult) 替代回调,实现更安全的单向数据流。
  3. UI层:逐步引入Jetpack Compose,同时兼容现有的 View/XML。

在重构交易模块(Trade Module)时,我发现了一个绕不开的架构痛点:ViewModel 的依赖注入问题。为了解决这个问题,并为未来的 Compose 铺路,我建议在部分新模块中引入Hilt

本文将通过实际代码对比,解释为什么要这么做,以及它能为团队带来什么实际收益。


痛点:手动管理的“依赖地狱”

在新的架构中,我们遵循 MVVM 原则。一个标准的TradeViewModel通常需要两个依赖:

  1. TradeApiService:用于网络请求(我们需要注入它)。
  2. SavedStateHandle:用于在进程被杀后恢复数据(系统提供,用于获取 Intent 参数)。

❌ 如果不使用 Hilt(现状)

由于SavedStateHandle是系统创建的,而ApiService是我们要传入的,手动把这两个东西组合进 ViewModel 的构造函数非常痛苦。我们必须不得不为每一个 ViewModel 手动写一个Factory类:

1. 繁琐的 ViewModelFactory

// 每一个 ViewModel 都要写这样一个 Factory,全是样板代码classTradeViewModelFactory(privatevalapiService:TradeApiService,owner:SavedStateRegistryOwner,defaultArgs:Bundle?=null):AbstractSavedStateViewModelFactory(owner,defaultArgs){overridefun<T:ViewModel>create(key:String,modelClass:Class<T>,handle:SavedStateHandle):T{// 我们必须手动组装:系统给的 handle + 我们给的 apiServiceif(modelClass.isAssignableFrom(TradeViewModel::class.java)){@Suppress("UNCHECKED_CAST")returnTradeViewModel(handle,apiService)asT}throwIllegalArgumentException("Unknown ViewModel class")}}

2. 在 Activity 中尴尬的调用

// 我们必须手动获取 Retrofit 实例,手动创建 Repository,再手动 new Factoryvalapi=RetrofitClient.getInstance().create(TradeApiService::class.java)valfactory=TradeViewModelFactory(api,this,intent.extras)// 终于拿到了 ViewModelvalviewModel=ViewModelProvider(this,factory)[TradeViewModel::class.java]

问题总结:

  • 代码冗余:每增加一个页面,就得写一个 Factory,维护成本高。
  • 容易出错:如果 ViewModel 加了一个参数(比如UserHelper),需要修改 Factory 和所有调用这个 Factory 的 Activity。
  • 生命周期风险:如果RetrofitClient不是单例,或者我们需要传递一个Activity级别的对象,手动管理生命周期很容易导致内存泄漏。

解决方案:引入 Hilt 后的世界

Hilt 是 Google 官方推荐的依赖注入库,它是专门为 Android 场景优化的(基于 Dagger 但去除了复杂性)。

✅ 使用 Hilt 之后

1. ViewModel 极其清爽
删掉 Factory 类,直接在构造函数上加注解。Hilt 会自动处理SavedStateHandleApiService的混合注入。

@HiltViewModelclassTradeViewModel@Injectconstructor(privatevalsavedStateHandle:SavedStateHandle,// Hilt 自动处理系统参数privatevalapiService:TradeApiService// Hilt 自动从容器中注入):ViewModel(){// ... 业务逻辑}

2. Activity 中零样板代码

@AndroidEntryPointclassTradeActivity:AppCompatActivity(){// 就像魔法一样,直接获取,所有依赖自动注入完成privatevalviewModel:TradeViewModelbyviewModels()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)// ...}}

收益总结:

  • 消灭样板代码:彻底删除了所有的ViewModelFactory
  • 关注点分离:Activity 不需要知道 ViewModel 依赖了什么,只需要使用它。
  • 自动生命周期管理:Hilt 自动处理单例(@Singleton)或跟随 Activity 销毁的对象,杜绝内存泄漏。

核心收益分析

1. 解决SavedStateHandle的注入难题

这是最直接的收益。在现代 Android 开发中,SavedStateHandle是标准组件。手动混合注入它和其他业务 Service 非常反人类。Hilt 对此有原生支持,能够极大地提升开发体验。

2. 为 Jetpack Compose 铺路

团队规划未来会引入 Compose。在 Compose 中,UI 是一棵函数树。

  • 没有 Hilt:我们需要把 ViewModel 或者 Repository 从最顶层的Screen一层层传到最底层的Button(即 Prop Drilling),代码非常丑陋。
  • 有了 Hilt:我们可以在任何层级的 Composable 函数中,通过hiltViewModel()直接获取 ViewModel,这是 Compose 开发的最佳实践。

3. 渐进式迁移,不影响旧代码

引入 Hilt不需要重构现有的 Java 代码或旧模块。

  • Hilt 可以和手动注入共存。
  • 我们可以在新的“交易模块”中试用 Hilt。
  • 旧的 Activity 和 Java 逻辑保持原样,互不干扰。

常见顾虑解答

Q: 引入 Hilt 会不会让代码变得很复杂?

A:不会,反而更简单了。以前的 Dagger2 确实复杂,但 Hilt 隐藏了 Component/Module 的组装逻辑。对于业务开发来说,90% 的场景只需要@HiltViewModel@Inject@AndroidEntryPoint三个注解。

Q: 会影响编译速度吗?

A:Hilt 使用 KAPT/KSP 处理注解,会有轻微的编译时间增加(通常几秒),但换来的是运行时性能的提升(没有反射)和代码量的显著减少。对于我们的项目规模,这点损耗完全可以接受。


结论

引入 Hilt 不是为了追求新技术,而是为了解决ViewModel 工厂代码冗余依赖管理混乱的实际问题。

特别是在结合Retrofit + Coroutines + Sealed Classes的新架构下,Hilt 补全了最后一块拼图,让我们能以更少的代码写出更健壮的逻辑。

建议方案:在当前的“交易模块”重构分支中试行 Hilt,验证其对开发效率的提升,若效果良好再逐步推广。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:35:21

Wan2.2-T2V-A14B适合哪些行业?这5大领域最具潜力

Wan2.2-T2V-A14B适合哪些行业&#xff1f;这5大领域最具潜力 你有没有想过&#xff0c;未来拍电影可能不再需要摄影棚、灯光组和复杂的剪辑流程&#xff1f; 只需输入一句描述&#xff1a;“夕阳下&#xff0c;穿旗袍的女子撑着油纸伞走过青石板路&#xff0c;雨滴轻敲屋檐”&a…

作者头像 李华
网站建设 2026/4/23 11:12:13

【完整源码+数据集+部署教程】电子废物检测回收系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着全球电子产品的快速发展和普及&#xff0c;电子废物&#xff08;E-waste&#xff09;问题日益严重。根据联合国环境规划署的报告&#xff0c;全球每年产生的电子废物数量已超过5000万吨&#xff0c;预计到2030年这一数字将达到7400万吨。电子废物不仅占用了大…

作者头像 李华
网站建设 2026/4/23 12:35:44

计算机毕设Java民宿后台管理系统的设计与实现 基于Java的民宿在线管理平台的设计与开发 Java技术在民宿后台管理系统中的应用与实现

计算机毕设Java民宿后台管理系统的设计与实现f5tia9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着互联网的普及和人们生活水平的提高&#xff0c;民宿行业迅速发展。传统…

作者头像 李华
网站建设 2026/4/23 12:34:04

JeeLowCode低代码开发框架完整部署指南

JeeLowCode是一款基于Spring Boot Vue3的企业级低代码开发框架&#xff0c;采用多模块架构设计&#xff0c;专为快速构建企业级管理系统而生。本指南将带您从零开始完成整个项目的部署配置&#xff0c;避开常见技术陷阱。 【免费下载链接】jeelowcode &#x1f525;JeeLowCode…

作者头像 李华
网站建设 2026/4/23 11:13:05

减肥后为什么体重容易反弹?脂肪细胞竟然有“肥胖记忆”!

很多朋友都有过这样的经历&#xff1a;辛辛苦苦减下来的体重&#xff0c;没过多久就又悄悄爬回来了。这背后&#xff0c;可能不只是“管不住嘴”那么简单。2024年12月&#xff0c;《Nature》杂志上的一项研究揭示了一个令人惊讶的真相&#xff1a;你的脂肪细胞&#xff0c;竟然…

作者头像 李华
网站建设 2026/4/23 12:35:20

智能体(Agent)

&#x1f4a1; 每天认识一个AI行业术语&#xff1a;智能体&#x1f916; 在人工智能的世界里&#xff0c;有一个术语你可能听说过&#xff0c;但不一定完全了解——智能体&#xff08;Agent&#xff09;。&#x1f50d; 智能体的定义&#xff1a;智能体&#xff0c;也被称为AI代…

作者头像 李华