MVVMLin网络请求封装:Retrofit+FlowAdapterFactory实现优雅API调用
MVVMLin网络请求封装RetrofitFlowAdapterFactory实现优雅API调用【免费下载链接】MVVMLin一个基于MVVM用KotlinRetrofit协程ViewbindingFlow来封装的快速开发框架项目地址: https://gitcode.com/gh_mirrors/mv/MVVMLinMVVMLin是一个基于MVVM架构采用KotlinRetrofit协程ViewbindingFlow封装的快速开发框架。本文将详细介绍如何通过FlowAdapterFactory实现网络请求的优雅封装帮助开发者简化API调用流程提升代码质量与开发效率。为什么选择RetrofitFlow组合在Android开发中网络请求是核心模块之一。传统的Callback方式容易导致回调地狱而Retrofit结合Kotlin Flow的响应式编程模式能够以更简洁的代码处理异步数据流同时提供生命周期感知能力有效避免内存泄漏。MVVMLin框架通过FlowAdapterFactory将Retrofit的Call对象转换为Flow数据流实现了以下优势简化代码用协程替代回调代码更线性直观响应式处理支持数据变化监听与事件流操作错误统一处理集中管理网络异常与业务错误生命周期感知自动绑定UI生命周期避免无效数据更新FlowAdapterFactory核心实现解析1. 适配器工厂创建FlowAdapterFactory是连接Retrofit与Flow的桥梁其核心作用是将Retrofit的Call对象适配为Flow数据流。关键代码位于mvvmlin/src/main/java/com/aleyn/mvvm/adapter/FlowAdapterFactory.ktclass FlowAdapterFactory private constructor(private val async: Boolean) : CallAdapter.Factory() { override fun get(returnType: Type, annotations: Arrayout Annotation, retrofit: Retrofit): CallAdapter*, *? { val rawType getRawType(returnType) if (rawType ! Flow::class.java) return null // 处理Flow泛型类型 val flowType getParameterUpperBound(0, returnType as ParameterizedType) return if (getRawType(flowType) Response::class.java) { FlowCallAdapter(getParameterUpperBound(0, flowType as ParameterizedType), false, async) } else { FlowCallAdapter(flowType, true, async) } } companion object { JvmStatic fun create(async: Boolean false) FlowAdapterFactory(async) } }该实现通过Retrofit的CallAdapter.Factory接口检查返回类型是否为Flow然后创建对应的FlowCallAdapter实例。2. 网络请求执行器FlowCallAdapter负责实际执行网络请求并转换为Flow流实现代码位于mvvmlin/src/main/java/com/aleyn/mvvm/adapter/FlowCallAdapter.ktclass FlowCallAdapterR : Type( private val responseBodyType: R, private val isBody: Boolean, private val isAsync: Boolean ) : CallAdapterR, Flow* { override fun adapt(call: CallR): Flow* { val callResponse if (isAsync) ASyncCall(call) else SyncCall(call) return if (isBody) bodyFlow(callResponse) else responseFlow(callResponse) } private fun responseFlow(call: CallResponse): FlowResponse* flow { emit(call.call()) } private fun bodyFlow(call: CallResponse): Flow* flow { val response call.call() if (response.isSuccessful) { emit(response.body()!!) } else { throw HttpException(response) } } }核心逻辑根据isAsync参数选择同步或异步请求模式responseFlow直接发射完整Response对象bodyFlow仅发射响应体并自动处理HTTP错误状态3. 框架集成方式在Retrofit客户端配置中添加FlowAdapterFactory代码位于app/src/main/java/com/pcl/mvvm/utils/RetrofitClient.ktval retrofit Retrofit.Builder() .baseUrl(Constant.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(FlowAdapterFactory.create(true)) .build()通过FlowAdapterFactory.create(true)启用异步请求模式使网络请求在后台线程执行避免阻塞主线程。实际应用场景1. 定义API接口在app/src/main/java/com/pcl/mvvm/network/api/HomeService.kt中定义Flow返回类型的APIinterface HomeService { GET(banner/json) fun getBanner(): FlowBannerBean GET(article/list/{page}/json) fun getHomeList(Path(page) page: Int): FlowHomeListBean }2. ViewModel中使用在ViewModel中通过Repository调用API并将结果转换为UI状态class HomeViewModel : BaseViewModel() { private val repository by lazy { HomeRepository() } val bannerData MutableStateFlowListBannerBean.DataBean(emptyList()) fun getBanner() { launchUI { repository.getBanner().collect { bannerData.value it.data ?: emptyList() } } } }3. UI层观察数据在Fragment中观察ViewModel的数据变化class HomeFragment : BaseVMFragmentHomeViewModel() { override fun initView() { viewModel.bannerData.observe(viewLifecycleOwner) { banners - bannerAdapter.setList(banners) } viewModel.getBanner() } }错误处理机制MVVMLin框架提供了统一的错误处理机制通过ExceptionHandle.kt集中处理网络异常object ExceptionHandle { fun handleException(e: Throwable): ResponseThrowable { return when (e) { is HttpException - { // 处理HTTP错误状态码 ResponseThrowable(e.code(), e.message()) } is ConnectException - { ResponseThrowable(ERROR.NETWORK_ERROR, 网络连接失败) } // 其他异常处理... else - { ResponseThrowable(ERROR.UNKNOWN, 未知错误) } } } }在ViewModel中通过launchUI函数自动捕获并处理异常无需手动try-catchlaunchUI { // 异常会被自动捕获并处理 repository.getHomeList(page).collect { // 处理正常数据 } }总结与最佳实践通过MVVMLin框架的FlowAdapterFactory实现我们可以简化网络请求代码用Flow替代传统Callback减少模板代码提升代码可读性线性代码结构更符合直觉优化生命周期管理自动绑定UI生命周期避免内存泄漏统一错误处理集中管理各类网络异常建议在实际项目中始终使用launchUI函数执行网络请求确保异常被正确处理根据业务需求选择同步或异步请求模式合理设计数据模型配合Flow的操作符进行数据转换在Repository层统一处理数据缓存逻辑MVVMLin框架的网络请求封装为Android开发提供了一种优雅高效的解决方案帮助开发者更专注于业务逻辑实现提升应用质量与开发效率。【免费下载链接】MVVMLin一个基于MVVM用KotlinRetrofit协程ViewbindingFlow来封装的快速开发框架项目地址: https://gitcode.com/gh_mirrors/mv/MVVMLin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

终极Pebble模板引擎指南:如何在Java项目中快速构建动态网页

终极Pebble模板引擎指南:如何在Java项目中快速构建动态网页

终极Pebble模板引擎指南:如何在Java项目中快速构建动态网页 【免费下载链接】pebble Java Template Engine 项目地址: https://gitcode.com/gh_mirrors/peb/pebble Pebble是一个基于Java的模板引擎,灵感来源于Twig,专门为Java Web开发…

2026/7/26 17:47:05阅读更多 →
如何快速掌握开源飞行动力学仿真工具:JSBSim新手入门完全指南

如何快速掌握开源飞行动力学仿真工具:JSBSim新手入门完全指南

如何快速掌握开源飞行动力学仿真工具:JSBSim新手入门完全指南 【免费下载链接】jsbsim An open source flight dynamics & control software library 项目地址: https://gitcode.com/gh_mirrors/js/jsbsim JSBSim是一款功能强大的开源飞行动力学与控制软…

2026/7/26 17:47:05阅读更多 →
Wand-Enhancer完整指南:免费解锁WeMod高级功能的终极方案

Wand-Enhancer完整指南:免费解锁WeMod高级功能的终极方案

Wand-Enhancer完整指南:免费解锁WeMod高级功能的终极方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为WeMod专业版的高昂订阅…

2026/7/26 17:45:05阅读更多 →
b站视频文案提取用什么工具:创作者复盘自己作品时怎么选

b站视频文案提取用什么工具:创作者复盘自己作品时怎么选

上周把账号里三条代表作拿出来做「话术体检」:一条 40 秒片头钩子、一条 12 分钟教程、一条双人连麦答疑。同事随口问「b站视频文案提取用什么工具」,我没甩榜单,而是按复盘任务拆选型——不同时长、不同产物,工具不是同一个。前提…

2026/7/26 19:23:27阅读更多 →
视频文案提取免费软件有哪些:全免、额度、按次三层怎么拆

视频文案提取免费软件有哪些:全免、额度、按次三层怎么拆

同事甩来一张「视频文案提取免费软件有哪些」的收藏夹,里面把系统自带、会员试用、按次小程序全标成免费。我花一晚把它们拆成三层:全免层、额度层、按次层——每一层「免费」含义不同,混谈只会踩坑。拆完之后,收藏夹从二十多个名…

2026/7/26 19:23:27阅读更多 →
Vuetify0:革命性Vue 3 Composable UI引擎,彻底释放界面开发潜力

Vuetify0:革命性Vue 3 Composable UI引擎,彻底释放界面开发潜力

Vuetify0:革命性Vue 3 Composable UI引擎,彻底释放界面开发潜力 【免费下载链接】0 0️⃣ Composable UI engine for Vue. Build complex interfaces with reusable state, logic, and primitives—without being locked into components or styles. 项…

2026/7/26 19:23:27阅读更多 →
苹果手机视频提取文字用什么工具:画面字与口播要分两条线

苹果手机视频提取文字用什么工具:画面字与口播要分两条线

上周三,市场部的小林蹲在展厅角落,用苹果手机竖拍了一段三分钟口播,镜头里还晃过展板标语。回酒店她才发现:想抄展板上的字,和想把嘴里说的话变成可改文稿,根本不是同一件事。同事还把「识图抄字」和「听声…

2026/7/26 19:23:27阅读更多 →
三维安全感知系统在工业监控中的应用与实现

三维安全感知系统在工业监控中的应用与实现

1. 项目背景与核心价值 在传统工业安全监控领域,二维平面的人员统计技术已经沿用多年。这种基于平面图像分析的方案存在明显的视角局限——当人员重叠或遮挡时,系统往往无法准确识别个体。某大型港口机械制造厂的安防负责人曾向我吐槽:"…

2026/7/26 19:23:27阅读更多 →
星火应用商店:让Linux软件安装变得简单又高效

星火应用商店:让Linux软件安装变得简单又高效

星火应用商店:让Linux软件安装变得简单又高效 【免费下载链接】星火应用商店Spark-Store 星火应用商店是国内知名的linux应用分发平台,为中国linux桌面生态贡献力量 项目地址: https://gitcode.com/spark-store-project/spark-store 还在为Linux系…

2026/7/26 19:21:27阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/26 0:01:28阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/26 0:01:28阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/26 0:01:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/25 23:03:25阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/26 19:05:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/26 19:05:21阅读更多 →