2016-10-06 53 views
2

我想使用这个MVVM为我的android应用程序。我做了很多应用程序,但我试图在另一个层面上尝试使用MVVM。但我需要了解我应该从哪里加载互联网的数据。我正在使用RxJava,但我不确定是否应该只在ViewModel中加载数据。如果是这样,那么我在哪里设置数据。我使用谷歌的Databinding,但我不想通过viewModel在xml中设置数据。我想从java文件中设置它。MVVM - 从哪里加载数据从互联网

对不起,如果我误写了某些内容,发布了答案,我会尝试填写所需的任何信息。

回答

1

“触发DataLoad”是表示逻辑的一部分。因此,这应该属于ViewModel。

有关“数据如何加载”的详细信息,例如联网逻辑,不属于ViewModel层。我强烈建议您使用Retrofit,因为您已经在使用RxJava。

由于rx.Observabledatabinding.ObservableField非常相似,您可以将它们从一种形式转换为另一种形式。我写了一个library,允许你这样做。有关实现请参见FieldUtils.java

无论哪种方式,假设你有一个DataService接口/类:

public interface DataService { 
    Observable<String> loadSomeData(); 
} 

,你可以建立你的视图模型如下:

public class ExampleViewModel { 
    ObservableField<String> title; 

    public ExampleViewModel(DataService dataService) { 
     this.title = FieldUtils.toField(dataService.loadSomeData()); 
    } 
} 

然后,您可以使用数据绑定在你的视图显示此语法

<TextView 
    android:text="@{viewModel.title}" /> 

我最近在博客上介绍如何使用RxJava wi第MVVM。我展示了一个应用程序,它使用Retrofit从Github加载事件列表,并将它们显示在RecyclerView中。这已经在MVVM中实现。

条链路: MVVM using RxJava + Data Binding example: Loading data using Retrofit

一个更复杂的例子,其还示出了负载指示器和错误:DataLoadingViewModel.java

+0

谢谢你的回答我很感激。可悲的是,我必须亲自学习它(我花了几天的时间学习其他项目)。回到答案中,我实际上是在使用RxJava的项目中使用Retrofit。我现在明白我需要在ViewModel中加载数据,并且通过它设置绑定。但是,例如,我不确定是否可以在视图(活动)中设置RecyclerView。另外我想知道,为什么不使用@Bindable而不是ObservableField(即使它看起来相同,至少对我来说),如果有一些不同,也让我知道。再一次感谢你 :) – Bartando

0

有两种类似的架构模式 - MVP和MVVM。主要区别在于MVP parttern Presenter决定如何显示数据,但在MVVM模式下,View收到Model并呈现自身(从模型中获取数据)。古典MVVM的例子是view bindig。但重点是 - 您使用的模式不重要,您应该获取模型中的所有数据 - 并将所有业务逻辑放置在模型中。

+0

因此,如果我理解正确,我应该加载,工作并将数据保存在ViewModel中,然后通过ViewModel将其设置为View。所以视图本身对数据的操作几乎为零?对不起,我只是想正确理解模式。 – Bartando