an/a Activity/Fragment 的所有数据相关操作是否由 ViewModel 负责处理?

Is the ViewModel responsible for handling all the data related operations of an/a Activity/Fragment?

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

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

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

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

我只想问几个问题:-

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

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

  3. 如果我需要执行一些基于上下文的操作,我会在 activity 或片段。我有什么约定或准则吗 应该在 ViewModel 中完成吗?

那么,让我开始吧,这些问题真的很值得问。我很乐意回答。

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

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

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

下图来自 Google 是著名的 MVVM 架构高级图片之一。

这个小答案要说的东西太多了。我想如果你查看 MVVM 架构,你会自动找到所有问题的明确答案等等。

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

Sample Apps by Google