ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

源码揭秘 LoadingAndRetryManager:View 替换机制背后的 5 个关键设计细节

源码揭秘 LoadingAndRetryManager:View 替换机制背后的 5 个关键设计细节 源码揭秘 LoadingAndRetryManagerView 替换机制背后的 5 个关键设计细节【免费下载链接】LoadingAndRetryManager无缝为Activity、Fragment、任何View设置加载loading、重试(retry)和无数据empty页面。项目地址: https://gitcode.com/gh_mirrors/lo/LoadingAndRetryManagerLoadingAndRetryManager 是一个能无缝为 Activity、Fragment 以及任意 View 设置加载loading、重试retry和无数据empty页面的 Android 开源库。很多开发者能熟练调用它的 API却未必清楚底层原理——尤其是那套偷天换日的View 替换机制。本文带你走进源码揭秘 LoadingAndRetryManager 背后 5 个关键设计细节帮你彻底看懂加载重试页面封装的核心思想。设计一统一入口 generate()让 Activity、Fragment、任意 View 一视同仁打开核心文件 LoadingAndRetryManager.java 你会发现所有使用场景都走同一个入口LoadingAndRetryManager.generate(activityOrFragmentOrView, listener)。构造函数里通过instanceof判断参数类型传 Activity通过findViewById(android.R.id.content)找到内容父容器传 Fragment通过fragment.getView().getParent()拿到宿主父容器传任意 View同样通过view.getParent()找到它的父容器。这种统一入口 内部类型分发的设计让调用方完全不用关心自己处于什么场景一行代码即可接入这是 LoadingAndRetryManager 易用性的第一层保障。设计二核心的 View 替换机制——先移除再原位插入View 替换机制是整个库最精妙的地方。它的思路很朴素把原来的内容 View 从父容器中移除再在相同位置插入一个包装容器。具体步骤是记录旧内容 View 在父容器中的下标index对 Activity/Fragment 默认取第一个子 View对 View 则遍历查找contentParent.removeView(oldContent)移除旧内容创建LoadingAndRetryLayout本质是一个 FrameLayout复用旧 View 的LayoutParams在原来的index位置addView(loadingAndRetryLayout, index, lp)最后把旧内容通过setContentView(oldContent)塞进包装容器里。整个过程中旧 View 实例没有销毁只是被请进了新容器所以页面上所有原有逻辑、监听器都完好无损真正做到了无侵入替换。这也是它敢叫无缝的底气所在。设计三LoadingAndRetryLayout 四视图管理只用 visibility 切换状态替换完成之后状态切换的重任交给了 LoadingAndRetryLayout.java。这个类继承自 FrameLayout内部持有 4 个成员变量mLoadingView加载页mRetryView重试页mContentView内容页mEmptyView空数据页showLoading()、showRetry()、showContent()、showEmpty()四个公开方法最终都汇聚到私有的showView()方法里把目标 View 设为VISIBLE同时把其余三个全部设为GONE保证任意时刻只有一个状态页可见。用可见性切换而非动态增删 View代价极小、性能友好这也是大量状态管理库的通用做法。值得一提的是每个 setter 方法如setContentView都先removeView再addView并支持布局 id 与 View 对象两种传参方式灵活性十足。设计四主线程安全——Looper 判断 post 兜底Android 中 UI 操作必须在主线程执行而加载、请求数据往往发生在子线程。LoadingAndRetryManager 贴心地内置了线程切换逻辑isMainThread() 判断 Looper.myLooper() Looper.getMainLooper()如果当前是主线程直接调用showView()否则通过post(new Runnable())投递到主线程执行。这样你在任意子线程里调用showLoading()、showRetry()都绝对安全不用自己写runOnUiThread从源头上规避了CalledFromWrongThreadException。设计五监听器 全局默认布局扩展性拉满最后一个关键设计在 OnLoadingAndRetryListener.java 里。它提供了三种定制层次全局默认在 Application 中设置BASE_LOADING_LAYOUT_ID、BASE_RETRY_LAYOUT_ID、BASE_EMPTY_LAYOUT_ID见 MyApplication.java全 App 共享一套基础页面局部定制重写generateLoadingLayout()、generateRetryLayout()、generateEmptyLayout()返回自定义布局事件回调setRetryEvent(View)、setLoadingEvent(View)、setEmptyEvent(View)让每个页面都能独立绑定重试点击等交互参考 MainActivity.java 中findViewById(R.id.id_btn_retry)的用法。配套的默认布局可以在res/layout/base_loading.xml、base_retry.xml、base_empty.xml中找到拿来即改、非常方便。写在最后回顾这 5 个设计细节统一入口降低了使用门槛移除再插入的 View 替换机制实现了无侵入改造四视图 visibility 切换保证了切换性能Looper 判断消除了线程隐患而监听器 全局默认布局的组合让定制能力收放自如。整套设计加起来不到千行代码却把加载、重试、空数据这个高频需求抽象得干净利落。如果你正在开发自己的状态管理组件不妨把 LoadingAndRetryManager 当作一份优秀的范本——先替换容器再管理状态最后留好扩展口三步走完一个通用加载重试组件就诞生了。【免费下载链接】LoadingAndRetryManager无缝为Activity、Fragment、任何View设置加载loading、重试(retry)和无数据empty页面。项目地址: https://gitcode.com/gh_mirrors/lo/LoadingAndRetryManager创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表