【问题标题】:Android, Do I use ViewModel to perform insertion or update?Android,我是否使用 ViewModel 执行插入或更新?
【发布时间】:2019-04-23 10:53:21
【问题描述】:

我了解架构组件中的 ViewModel 用于存储和管理数据,因此不会在配置更改期间丢失。

例如,我的活动与 LiveData 或使用存储数据无关。我还应该通过 ViewModel 吗?还是直接实例化 Repo 类并调用插入方法?我希望这是有道理的

我使用 ViewModel 的一个例子

public class MainViewModel extends AndroidViewModel {
    private DataRepo dataRepo;
    private LiveData<List<Group>> groupList;
    private LiveData<List<Bill>> billList;

    public MainViewModel(Application application) {
        super(application);
        dataRepo = new DataRepo(this.getApplication));
        groupList = dataRepo.getGroup();
        billList = dataRepo.getBill();
    }

    public LiveData<List<Group>> getGroupList() {
        return groupList:
    }

    public LiveData<List<Bill>> getBillList() {
        return billList:
    }

    public void insertGroupAndMember(Group group) {
        dataRepo.insertGroupAndMember(group);
    }

    public void insertBills(List<Bill> bills) {
        dataRepo.insertBills(bills);
    }

    public List<Member> getMemberList(Group group) {
        return dataRepo.getMembers(group);
    }
}

【问题讨论】:

    标签: android mvvm architecture


    【解决方案1】:

    我认为您希望使用 ViewModel 来使您的 UI 控制器尽可能干净。您的 viewmodel 应该调用 repo 来执行简单的 CRUD 操作。 请参阅以下文档中的snippet

    需要 UI 控制器 还负责从数据库或网络加载数据 增加类膨胀。将过多的责任分配给 UI 控制器可能会导致单个类尝试处理所有 应用程序本身的工作,而不是将工作委托给其他类。 以这种方式将过多的责任分配给 UI 控制器 也使测试变得更加困难。

    【讨论】:

      【解决方案2】:

      我建议您考虑以下几点:

      • MVVM 作为一种模式可以追溯到 2000 年,例如,here is Martin Fowler's article 关于这个概念,2005 年,John Gossman 在他的博客中宣布了这种模式。是的,它解决了 android 的模式实现中的旋转问题,但是没有它也可以解决这个问题。实际上需要 MVVM 来将 表示状态 与最终用户看到的视图分开。正如维基所说 -

      视图模型是公开属性和命令的视图的抽象。 MVVM 不是 MVC 模式的控制器或 MVP 模式的演示者,而是有一个绑定器,它可以自动在视图及其在视图模型中绑定的属性之间进行通信。视图模型已被描述为模型中数据的状态。

      因此,主要(就像所有其他 GUI 架构模式一样)是关于应用程序的 视图 部分之间的抽象,因此它们可以独立变化,并且对系统的后续更改将很便宜。

      • 在视图范围内实例化域对象及其随后被视图使用会导致视图和域对象之间的紧密耦合,这是任何系统的不良特性。此外,更改视图内部结构的另一个原因是,如果域对象的构造逻辑发生更改 - 视图也必须更改。

      如果ViewModel 对你来说太过分了(如我所见,在这种特殊情况下,它的好处与你无关,因为 UI 不是很复杂,而且它的状态是轻量级的),考虑使用重量较轻的抽象,例如 MVP。因此,您将能够在应用程序中保留视图和模型之间的抽象(没有不必要的耦合),并且您不必支持您无法从中受益的代码。

      【讨论】:

        猜你喜欢
        • 2018-05-17
        • 2017-07-21
        • 2017-04-14
        • 2011-08-22
        • 1970-01-01
        • 2012-10-29
        • 2017-12-29
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多