我们应该异步地初始化我们的ViewModel。直接从本地SQLite数据库加载数据可能非常快(但并非总是如此)。如果我们要从某个远程源中抽取数据,那将是非常明显的延迟。因此,用户需要对其进行一些视觉反馈,并且主UI必须不可用。
当数据为ViewModel准备时或当我们发送一些数据进行处理(等待ViewModel中的更改)时,显示进度的最佳做法是什么?
例如,如果LiveData值为null,请切换到“加载进度”片段,并在那里准备ViewModel,然后在就绪时切换回去?但是ViewModel曾经被绑定到特定的片段...
只是在加载/处理数据时使某些根视图不可见?换句话说,在每个片段中添加了一些进度部分来显示它而不是主要内容? 但是,这种方法需要太多的样板代码才能用于许多布局。
如果知道期望几乎立即加载数据,我们应该对此加以注意吗?
您如何处理JetPack应用程序中长期运行的用户界面?
答案 0 :(得分:0)
我在官方文档和示例中找到了答案。 这是2个部分:
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的真正好处是什么?为了通过良好的错误处理正确地完成事情,需要反馈进度,我们需要维护太多的样板代码。 他们在自己的向导中主张权利:
在上面推荐的应用架构部分,我们省略了网络 错误和加载状态,以使代码段保持简单。
因为似乎LiveData的设计并非旨在简化进度和错误处理。