an/a Activity/Fragment 的所有数据相关操作是否由 ViewModel 负责处理?
Is the ViewModel responsible for handling all the data related operations of an/a Activity/Fragment?
我最近开始学习 Android 架构组件(LiveData
、ViewModel
和 Navigation
)。所以我创建了一个底部导航应用程序。
我在这里放一些示例代码只是为了作为例子来讨论。
SampleViewModel class:-
public class DashboardViewModel extends ViewModel {
private MutableLiveData<String> mText;
public DashboardViewModel() {
mText = new MutableLiveData<>();
mText.setValue("This is dashboard fragment");
}
public LiveData<String> getText() {
return mText;
}
}
示例片段类:-
public class DashboardFragment extends Fragment {
private DashboardViewModel dashboardViewModel;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
dashboardViewModel = ViewModelProviders.of(this).get(DashboardViewModel.class);
View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
final TextView textView = root.findViewById(R.id.text_dashboard);
dashboardViewModel.getText().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
}
让我明确一点,这些代码没有任何问题。
我只想问几个问题:-
ViewModel
是否完全负责加载将要加载的数据
由 activity 或片段使用?
如果我需要从服务器获取一些数据,我会调用 API
来自 ViewModel
或 activity 本身?
如果我需要执行一些基于上下文的操作,我会在
activity 或片段。我有什么约定或准则吗
应该在 ViewModel 中完成吗?
那么,让我开始吧,这些问题真的很值得问。我很乐意回答。
如果您遵循干净的架构,例如 MVVM(模型、视图、视图模型),则为是。因此,在这种架构中,您的视图实际上是虚拟的,并且对数据的来源一无所知。他们唯一做的就是在数据到来时显示数据。视图的唯一职责是呈现数据,视图不做任何业务或网络逻辑。另一方面,ViewModel 可以是单一的事实来源,并且与您的视图(片段,activity)具有一对一的关系,并且 ViewModel 具有生命周期感知能力,并且可以处理所有复杂而繁重的操作。在内部,您的视图模型可以依赖于您的存储库,该存储库在内部依赖于本地数据源和远程数据源。是的,ViewModel 必须是您的视图(activity、片段)加载数据的单一真实来源。
正如我所写,ViewModel 是唯一的真实来源,它应该是您可以从服务器或本地获取数据的来源。
这取决于。如果更多 UI 相关工作需要上下文,您可以在视图中完成。或者,如果它是需要上下文的繁重计算,例如从本地数据库读取数千行,您可以在 ViewModel 中执行。要在 ViewModel 或更低级别获取上下文引用,您可以使用 DI,例如 dagger 或 koin 来避免样板代码。
下图来自 Google 是著名的 MVVM 架构高级图片之一。
这个小答案要说的东西太多了。我想如果你查看 MVVM 架构,你会自动找到所有问题的明确答案等等。
Google 托管了一堆 MVVM 示例应用程序,您可以在以下列表中找到它。
我最近开始学习 Android 架构组件(LiveData
、ViewModel
和 Navigation
)。所以我创建了一个底部导航应用程序。
我在这里放一些示例代码只是为了作为例子来讨论。
SampleViewModel class:-
public class DashboardViewModel extends ViewModel {
private MutableLiveData<String> mText;
public DashboardViewModel() {
mText = new MutableLiveData<>();
mText.setValue("This is dashboard fragment");
}
public LiveData<String> getText() {
return mText;
}
}
示例片段类:-
public class DashboardFragment extends Fragment {
private DashboardViewModel dashboardViewModel;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
dashboardViewModel = ViewModelProviders.of(this).get(DashboardViewModel.class);
View root = inflater.inflate(R.layout.fragment_dashboard, container, false);
final TextView textView = root.findViewById(R.id.text_dashboard);
dashboardViewModel.getText().observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
}
让我明确一点,这些代码没有任何问题。
我只想问几个问题:-
ViewModel
是否完全负责加载将要加载的数据 由 activity 或片段使用?如果我需要从服务器获取一些数据,我会调用 API 来自
ViewModel
或 activity 本身?如果我需要执行一些基于上下文的操作,我会在 activity 或片段。我有什么约定或准则吗 应该在 ViewModel 中完成吗?
那么,让我开始吧,这些问题真的很值得问。我很乐意回答。
如果您遵循干净的架构,例如 MVVM(模型、视图、视图模型),则为是。因此,在这种架构中,您的视图实际上是虚拟的,并且对数据的来源一无所知。他们唯一做的就是在数据到来时显示数据。视图的唯一职责是呈现数据,视图不做任何业务或网络逻辑。另一方面,ViewModel 可以是单一的事实来源,并且与您的视图(片段,activity)具有一对一的关系,并且 ViewModel 具有生命周期感知能力,并且可以处理所有复杂而繁重的操作。在内部,您的视图模型可以依赖于您的存储库,该存储库在内部依赖于本地数据源和远程数据源。是的,ViewModel 必须是您的视图(activity、片段)加载数据的单一真实来源。
正如我所写,ViewModel 是唯一的真实来源,它应该是您可以从服务器或本地获取数据的来源。
这取决于。如果更多 UI 相关工作需要上下文,您可以在视图中完成。或者,如果它是需要上下文的繁重计算,例如从本地数据库读取数千行,您可以在 ViewModel 中执行。要在 ViewModel 或更低级别获取上下文引用,您可以使用 DI,例如 dagger 或 koin 来避免样板代码。
下图来自 Google 是著名的 MVVM 架构高级图片之一。
这个小答案要说的东西太多了。我想如果你查看 MVVM 架构,你会自动找到所有问题的明确答案等等。
Google 托管了一堆 MVVM 示例应用程序,您可以在以下列表中找到它。