news 2026/6/26 4:26:46

[Android MVVM 架构笔记] 基于 Kotlin 延迟委托实现全局统一 Loading

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Android MVVM 架构笔记] 基于 Kotlin 延迟委托实现全局统一 Loading

在日常项目开发中,像“收藏、删除、分享、修改”这类由用户点击按钮触发的异步网络操作,在架构上被称为操作性动作(Action Operations)

传统的做法要么是在每个页面的 XML 布局中重复堆砌进度条组件(造成 XML 极度冗余),要么是在基类(BaseActivity/BaseFragment)中强行塞入 Dialog 的控制逻辑(导致基类极度膨胀且难以维护)。更致命的是,若异步协程在后台结束并尝试关闭 Loading 时宿主已被用户切入后台,传统的生命周期管理极易引发StateLoss异常导致 App 闪退。

为了优雅地解决这一系列痛点,本方案遵循“单一职责原则”“组合优于继承”以及“编译期绝对安全”的原则,将 Loading 业务完全从基类中剥离,利用 Kotlin 属性延迟委托(by lazy)实现“按需插拔装载”,并通过系统原生组件级双重泛型约束,确保了极高的运行稳定性与代码优雅度。


一、 完整物理文件清单与物理路径

布局文件: app/src/main/res/layout/dialog_loading.xml 唯一样式 XML:毛玻璃质感加载卡片 包名/ui/widget/loading: app/src/main/java/xxx/ui/widget/loading/ ├── LoadingDelegate.kt 核心契约:Kotlin 风格加载委托接口 ├── LoadingDialogFragment.kt 弹窗组件:生命周期安全 DialogFragment └── LoadingDelegateImpl.kt 契约实现:完全闭环的 Dialog 调度者 包名/util/ext: app/src/main/java/xxx/util/ext/ └── ActivityExt.kt 系统级扩展:原生组件编译期安全响应式绑定

(注:请将路径中的xxx替换为您项目的实际根包名。)


二、 完整源码实现

1. 唯一样式 XML:dialog_loading.xml

  • 设计规范:采用 Material3 风格的 80% 半透明卡片,将整体 Loading 容器与具体页面布局 100% 解耦。
<?xml version="1.0" encoding="utf-8"?><com.google.android.material.card.MaterialCardViewxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="100dp"android:layout_height="100dp"android:layout_gravity="center"app:cardCornerRadius="12dp"app:cardElevation="6dp"app:cardBackgroundColor="#CCFFFFFF"><!-- 80% 不透明度白色 --><com.google.android.material.progressindicator.CircularProgressIndicatorandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:indeterminate="true"app:indicatorSize="40dp"app:trackThickness="4dp"app:indicatorColor="#2F74E5"/></com.google.android.material.card.MaterialCardView>

2. 核心控制契约:LoadingDelegate.kt

packagexxx.ui.widget.loading/** * 💡 纯净加载控制契约,在命名上与 Kotlin 的 by 委托机制对应 */interfaceLoadingDelegate{funshowLoading(show:Boolean)}

3. 生命周期安全弹窗:LoadingDialogFragment.kt

packagexxx.ui.widget.loadingimportandroid.graphics.Colorimportandroid.graphics.drawable.ColorDrawableimportandroid.os.Bundleimportandroid.view.LayoutInflaterimportandroid.view.Viewimportandroid.view.ViewGroupimportandroidx.fragment.app.DialogFragmentimportxxx.R//
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 4:23:04

AgentFlow API密钥安全配置:从环境变量到生产级密钥管理实践

1. 项目概述&#xff1a;为什么API密钥管理是AgentFlow的命门&#xff1f;最近在社区里看到不少关于AgentFlow的讨论&#xff0c;尤其是“openclaw如何切换api密钥”这类问题频繁出现。这让我意识到&#xff0c;很多开发者&#xff0c;无论是刚接触AgentFlow的新手&#xff0c;…

作者头像 李华
网站建设 2026/6/26 4:21:00

滑动窗口解法:最短子数组长度代码解释与优化

目录 一、代码逐行解释&#xff08;滑动窗口解法&#xff1a;最短子数组长度&#xff09; 原代码完整拆解 原代码存在的 BUG & 缺陷 二、标准优化版滑动窗口&#xff08;双指针&#xff09; 优化思路 三、优化点对比说明 四、逻辑流程演示&#xff08;举例&#xff…

作者头像 李华
网站建设 2026/6/26 4:15:14

32-Git 差异行号计算机制:平台如何知道“哪些行真的变了”

适合对象:关注增量分析、差异行提取、提交比较、代码变更精度的后端工程师和测试平台工程师。 先说结论 Git 差异行号计算机制不是一个孤立功能,而是精准测试平台里帮助团队做判断的一环。 它重点解决的是:平台如何知道“哪些行真的变了”。 用大白话讲,版本能力的重点不…

作者头像 李华