显示 Android JetPack 进度的最佳实践?
Best practices to show a progress for Android JetPack?
我们应该异步初始化我们的 ViewModel。直接从本地 SQLite 数据库加载数据可能非常快(但并非总是如此)。如果我们将从某个远程源提取数据,则可能会有相当明显的延迟。所以用户需要一些关于它的视觉反馈,并且 main UI 一定不可用。
在为 ViewModel 准备数据或我们发送一些数据进行处理(等待 ViewModel 中的更改)时显示进度的最佳做法是什么?
例如,如果 LiveData 值为 null 切换到加载进度片段并在那里准备 ViewModel 并在准备就绪时切换回来?但是 ViewModel 过去常常绑定到特定片段...
只是在数据 loaded/processed 时让一些根视图不可见?换句话说,在每个片段中添加一些进度部分来显示它而不是主要内容?
但是这种方法需要很多布局的样板代码。
如果知道预计几乎立即加载的数据,我们是否应该注意它?
您如何在 JetPack 应用程序中处理 运行 长操作 UI?
我在官方文档和示例中找到了答案。
这里有 2 个部分:
- 如何使用LiveData反馈进度
- 如何在 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 的真正好处是什么?为了通过良好的错误处理和进度反馈来做正确的事情,我们需要维护太多的样板代码。
他们在自己的指南中声称权利:
In the recommended app architecture section above, we omitted network
error and loading states to keep the code snippets simple.
因为看起来LiveData的设计并不是为了简单的进度和错误处理。
我们应该异步初始化我们的 ViewModel。直接从本地 SQLite 数据库加载数据可能非常快(但并非总是如此)。如果我们将从某个远程源提取数据,则可能会有相当明显的延迟。所以用户需要一些关于它的视觉反馈,并且 main UI 一定不可用。
在为 ViewModel 准备数据或我们发送一些数据进行处理(等待 ViewModel 中的更改)时显示进度的最佳做法是什么?
例如,如果 LiveData 值为 null 切换到加载进度片段并在那里准备 ViewModel 并在准备就绪时切换回来?但是 ViewModel 过去常常绑定到特定片段...
只是在数据 loaded/processed 时让一些根视图不可见?换句话说,在每个片段中添加一些进度部分来显示它而不是主要内容? 但是这种方法需要很多布局的样板代码。
如果知道预计几乎立即加载的数据,我们是否应该注意它?
您如何在 JetPack 应用程序中处理 运行 长操作 UI?
我在官方文档和示例中找到了答案。 这里有 2 个部分:
- 如何使用LiveData反馈进度
- 如何在 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 的真正好处是什么?为了通过良好的错误处理和进度反馈来做正确的事情,我们需要维护太多的样板代码。 他们在自己的指南中声称权利:
In the recommended app architecture section above, we omitted network error and loading states to keep the code snippets simple.
因为看起来LiveData的设计并不是为了简单的进度和错误处理。