新闻详情

新闻详情

首页 / 资讯中心 / 详情

Android Kotlin 待办事项 APP:Retrofit 网络异常处理与离线缓存

发布时间:2026/9/4 5:38:41来源:尧图网络
Android Kotlin 待办事项 APP:Retrofit 网络异常处理与离线缓存
在 Retrofit 接入之后网络请求失败、接口超时和用户离线仍然是实际项目中必须处理的问题。本文继续改造待办事项 APP分析 Room本地缓存、网络刷新、错误状态和重试机制的职责划分让页面在有网和无网环境下都能保持可用。一、为什么需要离线缓存如果页面每次打开都直接请求 Retrofit网络较慢时会出现空白页面没有网络时用户甚至无法查看之前保存的待办事项。Room 可以作为本地数据源Retrofit 负责从服务端刷新数据页面始终观察 Room 的数据变化。推荐的数据流如下服务端 API ↓ Retrofit Repository 处理刷新结果 ↓ 写入 Room 数据库 ↓ Flow ViewModel ↓ UiState Activity 渲染页面这种结构的重点是页面不直接依赖网络。即使接口暂时不可用Room 中的旧数据仍然可以显示。二、把 Room 作为主要数据源Repository 可以同时持有 DAO 和 ApiServiceclassTodoRepositoryInjectconstructor(privatevaltodoDao:TodoDao,privatevalapiService:TodoApiService){funobserveTodos():FlowListTodotodoDao.observeAllTodos()suspendfunrefresh():ResultUnitrunCatching{valremoteapiService.getTodos()todoDao.replaceAll(remote.map{it.toEntity()})}}observeTodos()不直接请求网络而是持续观察数据库。refresh()只负责拉取服务端数据并更新数据库。数据库更新后Room 的 Flow 会自动通知 ViewModel页面不需要手动刷新列表。三、设计刷新状态加载状态和错误提示不能只用一个 Boolean 表示。首次进入页面、已有缓存时刷新、刷新失败但仍有旧数据这些情况应该区分开dataclassTodoUiState(valtodos:ListTodoemptyList(),valisInitialLoading:Booleantrue,valisRefreshing:Booleanfalse,valerrorMessage:String?null,vallastSyncTime:Long?null)首次加载时可以显示进度条已有本地数据时只显示较轻量的刷新提示。这样不会因为一次网络请求而遮挡用户已经能够查看的内容。四、启动时先读本地再刷新网络ViewModel 可以让本地数据先显示再启动后台刷新init{viewModelScope.launch{repository.observeTodos().collect{todos-_uiState.update{it.copy(todostodos,isInitialLoadingfalse)}}}refresh()}funrefresh(){if(_uiState.value.isRefreshing)returnviewModelScope.launch{_uiState.update{it.copy(isRefreshingtrue,errorMessagenull)}repository.refresh().onSuccess{_uiState.update{it.copy(isRefreshingfalse,lastSyncTimeSystem.currentTimeMillis())}}.onFailure{error-_uiState.update{it.copy(isRefreshingfalse,errorMessageerror.toUserMessage())}}}}实际项目中要注意协程生命周期避免页面重复创建时启动多个刷新任务。isRefreshing只能减少重复点击若存在多个入口还可以进一步使用请求管理器或统一事件流。五、区分网络错误类型直接显示error.message往往不适合用户。可以根据异常类型转换为简短提示funThrowable.toUserMessage():String{returnwhen(this){isjava.net.UnknownHostException-当前没有网络连接isjava.net.SocketTimeoutException-请求超时请稍后重试else-数据刷新失败请稍后重试}}HTTP 401、403、404 和 500 并不是同一种问题。建议在网络层读取响应状态码再转换为统一的业务异常。认证失效应引导用户重新登录服务器错误可以提供重试按钮数据解析失败则需要检查接口字段变化。六、刷新失败时保留旧数据刷新失败不等于本地数据失效。Repository 不应该在请求开始前删除 Room 中的全部记录也不应在失败时把列表替换成空列表。正确的处理方式是保留旧数据只更新errorMessage和刷新状态。页面可以同时显示列表和错误提示state.errorMessage?.let{message-showSnackbar(message)}adapter.submitList(state.todos)这样用户仍然可以勾选、编辑和删除本地待办。若这些操作还没有实现服务端同步就应该在界面上明确它们当前只影响本地数据避免造成已经上传成功的误解。七、重试机制的边界重试适合处理临时超时或短暂网络波动不适合所有异常。可以采用有限次数和递增等待时间suspendfunTretryRequest(times:Int3,block:suspend()-T):T{varlastError:Throwable?nullrepeat(times){index-try{returnblock()}catch(error:Throwable){lastErrorerrorif(indextimes-1){delay((index1)*1_000L)}}}throwlastError?:IllegalStateException(request failed)}不应对所有 4xx 请求自动重试也不应在用户快速点击时无限发送请求。对于新增、编辑和删除操作还要考虑重复提交问题必要时使用请求 ID 或服务端幂等设计。八、Room 数据库的同步字段如果下一步要实现双向同步单纯的id、title和completed字段还不够。可以增加valsyncState:SyncStateSyncState.SYNCEDvalupdatedAt:LongSystem.currentTimeMillis()valdeleted:Booleanfalse删除操作不一定立即物理删除可以先使用软删除标记等服务端确认后再清理。updatedAt可用于判断较新的版本syncState则能区分待上传、同步成功和同步失败的记录。九、测试重点与开发边界至少需要测试首次启动、已有缓存时刷新、断网启动、请求超时、服务端返回错误、重复点击刷新和本地数据持续显示等场景。Repository 可以注入假的 ApiService使用固定返回值模拟成功与失败不必依赖真实服务器。当前工作区只有文章和示例配图没有完整 Android 源码、接口文档或后端服务因此本文无法确认真实的网络状态监听、错误码、字段结构和运行结果。Room 缓存与 ViewModel 状态属于客户端可独立改造的部分认证、双向同步、冲突解决和离线队列则需要结合服务端协议共同确定。总结离线缓存不是简单地把网络数据保存一份而是要明确数据源、刷新时机、错误状态和同步边界。以 Room 作为页面观察的数据源以 Retrofit 作为刷新渠道可以让待办事项 APP 在弱网或无网环境下仍保持基本可用也为后续登录、双向同步和后台任务留下清晰的扩展位置。文章标签Android Kotlin Retrofit Room 离线缓存 网络异常处理 MVVM APP开发
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python学习资源推送系统:从源码解析到个性化推荐算法实现 2026/9/4 6:29:50

Python学习资源推送系统:从源码解析到个性化推荐算法实现

简介:这是一套面向计算机专业本科生的Python毕业设计实战资源,聚焦学习资源个性化推送场景,帮助学生快速完成毕设开发与答辩准备。系统基于主流Python Web框架构建,集成用户行为分析、内容标签匹配与智能推荐逻辑,适用…

阅读更多 →
AI漫剧技术栈全解析:从本地部署到批量生成的成本与挑战 2026/9/4 6:29:50

AI漫剧技术栈全解析:从本地部署到批量生成的成本与挑战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Haocurve信号生成原理与MATLAB量化实战指南 2026/9/4 6:29:50

Haocurve信号生成原理与MATLAB量化实战指南

简介:本资源是一款面向科研人员、工程师及MATLAB初学者的轻量级曲线可视化工具——HaoCurve(俗称“薅曲线”),聚焦解决实验数据快速绘图、参数化调整与结果复现等高频需求。压缩包共3个文件(161KB)&#xf…

阅读更多 →
免编程超声波测距报警系统:从HC-SR04到继电器控制的实践指南 2026/9/4 6:29:50

免编程超声波测距报警系统:从HC-SR04到继电器控制的实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Java SSM健身房私教预约系统:从技术选型到高并发实战 2026/9/4 6:29:50

Java SSM健身房私教预约系统:从技术选型到高并发实战

简介:这是一套面向计算机专业本科生的高分毕业设计项目资源,聚焦健身房私教预约场景,解决传统线下预约效率低、信息不透明、管理粗放等实际问题,亦适用于课程设计与期末大作业实践。压缩包共1301个文件,涵盖233张界面截…

阅读更多 →
如何像专业人士一样构建 Python 应用 2026/9/4 6:26:49

如何像专业人士一样构建 Python 应用

多数刚开始学习的人具备编写代码的能力, 然而知晓怎样去规划应用结构, 从而保证项目易于维护并防止最终生成的代码杂乱无章的人却很少。在这个案例里, 你会学到专业开发者所运用的实践方式, 打造出结构干净整洁、方便调试、特别容易扩展的项目。案例说明:在下面的那…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞