【问题标题】:Best practices to show a progress for Android JetPack?显示 Android JetPack 进度的最佳实践?
【发布时间】:2023-03-19 04:45:02
【问题描述】:

我们应该异步初始化我们的 ViewModel。直接从本地 SQLite DB 加载数据可能非常快(但并非总是如此)。如果我们从某个远程源抽取数据,则可能会出现相当明显的延迟。所以用户需要一些视觉反馈,主 UI 一定不可用。

在为 ViewModel 准备数据或发送一些数据进行处理(等待 ViewModel 中的更改)时显示进度的最佳做法是什么?

例如,如果 LiveData 值为 null,则切换到 Loading Progress 片段并在那里准备 ViewModel 并在准备好时切换回来?但是 ViewModel 用于绑定到特定的片段...

只是在加载/处理数据时让一些根视图不可见?换句话说,在每个片段中添加一些进度部分来显示它而不是主要内容? 但是这种方法对于很多布局需要太多样板代码。

如果知道数据几乎会立即加载,我们是否应该小心处理它?

您如何处理 JetPack 应用程序中长时间运行的操作 UI?

【问题讨论】:

    标签: android user-interface android-architecture-components android-jetpack long-running-processes


    【解决方案1】:

    我在官方文档和示例中找到了答案。 这里有 2 个部分:

    1. 如何使用 LiveData 反馈进度
    2. 如何在 UI 上呈现进度

    1)答案在Guide to app architecture末尾找到

    向下滚动到“附录:公开网络状态”主题。 他们建议使用一些基于MediatorLiveData的 LiveData 包装器

    您必须编写和维护大量样板代码来包装任何需要跟踪进度或加载错误的 LiveData。

    2)在样本Android Architecture Components Basic Sample 您可以找到如何在 UI 上反馈加载过程的建议方法。 这个示例非常基础,所以它们只是在加载过程中隐藏 UI 小部件。

    每个片段布局都应该有一些进度支持的东西。这里我们只有变量:

    <data>
            <variable
                name="isLoading"
                type="boolean" />
    </data>
    

    并且我们在加载过程中要隐藏的每个小部件(视图)都应该具有属性:

    app:visibleGone="@{isLoading}"
    

    由于它是应用程序定义的属性,我们必须在某个地方注意它。所以应该有适配器来支持visibleGone

    public class BindingAdapters {
        @BindingAdapter("visibleGone")
        public static void showHide(View view, boolean show) {
            view.setVisibility(show ? View.VISIBLE : View.GONE);
        }
    }
    

    当然,我们可以使用 FrameLayout 之类的东西,并放置一些进度面板,它会遮挡我们的控件并显示一些滚动的进度轮(而不是简单地隐藏它并显示空屏幕)。 但问题是您必须注意每个片段布局。如果您有一些复杂的屏幕(例如选项卡),它可能会使您的代码更加复杂。

    结论: #2 或多或少是可行的解决方案。虽然我更喜欢在所有情况下使用单独的进度片段屏幕,并且不要用加载进度和错误处理内容来膨胀我的每个片段布局。

    但是#1 让我想知道使用 LiveData 的真正好处是什么?要通过良好的错误处理、进度反馈来做正确的事情,我们需要维护太多的样板代码。 他们声称自己的指南是正确的:

    在上面推荐的应用架构部分,我们省略了网络 错误和加载状态以保持代码 sn-ps 简单。

    因为 LiveData 的设计似乎不是为了轻松进行进度和错误处理。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      相关资源
      最近更新 更多