【问题标题】:Is the ViewModel responsible for handling all the data related operations of an/a Activity/Fragment?ViewModel 是否负责处理 an/a Activity/Fragment 的所有数据相关操作?
【发布时间】:2019-10-18 16:41:30
【问题描述】:

我最近开始学习 Android 架构组件(LiveDataViewModelNavigation)。所以我创建了一个底部导航应用程序。

我在这里放一些示例代码只是为了作为例子讨论。

SampleViewModel 类:-

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;
    }
}

SampleFragmentClass:-

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;
    }
}

让我明确一点,这些代码没有任何问题。

我只是想问一些问题:-

  1. ViewModel 是否完全负责加载将要加载的数据? 被活动或片段使用?

  2. 如果我需要从服务器获取一些数据,我会调用 API 来自ViewModel 还是活动本身?

  3. 如果我需要执行一些基于上下文的操作,我会在 活动或片段。是否有一些约定或指导方针,我 应该在 ViewModel 中做吗?

【问题讨论】:

    标签: java android android-jetpack android-viewmodel


    【解决方案1】:

    所以,让我开始吧,它们是非常好的问题。我很乐意回答。

    1. 是的,如果您遵循干净的架构,例如 MVVM(模型、视图、视图模型)。所以,在这个架构中,你的视图真的是假的,对数据的来源一无所知。他们唯一要做的就是在数据到来时显示数据。 View 的唯一职责是呈现数据,View 不做任何业务或网络逻辑。另一方面,ViewModel 可以是单一的事实来源,并且与您的视图(片段、活动)具有一对一的关系,并且 ViewModel 具有生命周期意识,并且可以处理所有复杂和繁重的操作。在内部,您的视图模型可以依赖于您的存储库,该存储库在内部依赖于本地数据源和远程数据源。是的,ViewModel 必须是您的视图(活动、片段)加载数据的单一事实来源。

    2. 正如我所写,ViewModel 是一个单一的事实来源,它应该是您可以从服务器或本地获取数据的来源。

    3. 这取决于。如果是更多与 UI 相关的工作需要上下文,您可以在视图中完成。或者,如果是需要上下文的繁重计算,例如从本地数据库读取数千行,您可以在 ViewModel 中执行。要在 ViewModel 或更低级别获取上下文引用,您可以使用 DI,例如 dagger 或 koin 来避免样板代码。

    下图来自谷歌,是著名的 MVVM 架构高级图之一。

    在这个小答案中有很多东西需要详细说明。我认为,如果您查看 MVVM 架构,您会自动为您的问题找到所有明确的答案等等。

    Google 托管了一系列适用于 MVVM 的示例应用程序,您可以在以下列表中找到。

    Sample Apps by Google

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2010-12-08
      • 2018-04-14
      相关资源
      最近更新 更多