2017-10-10 107 views
0

我无法理解MVVM究竟是什么?这怎么可能让下面的代码跟随MVVM或不是?

它是唯一的方法来确定代码清理器或类似设计模式,我不能理解什么是MVVM。

我已经制定了一个简单的教程,因为我一直使用DataBinding。如何区分它没有遵循MVVM?

我在这里得到简单的问题,希望我会得到明确的答案与示例。

MainActivity

public class MainActivity extends AppCompatActivity { 


    ActivityMainBinding activityMainBinding; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); 

     User user = new User("Android", "ios", "Blackberry"); 
     activityMainBinding.setVariable(user); 



    } 
} 

模态类

public class Client { 
    String name; 


public Client(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 
} 

布局

<data> 

    <variable 
     name="variable" 
     type="com.example.user_pc.databinding.User" /> 

</data> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/firstName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="30dp" 
     android:text="@{variable.firstName}" 

     /> 

    <TextView 
     android:id="@+id/middleName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="30dp" 
     android:text="@{variable.middleName}" /> 

    <TextView 
     android:id="@+id/lastName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:paddingBottom="30dp" 
     android:text="@{variable.lastName}" /> 


</LinearLayout> 

这似乎是简单的问题,但我正在努力理解 MVVM和它的工作flow.All正在不同的目录中的模型,视图和视图模型,它是只让direcotry的不同还是什么?我没有清楚的概念。

回答

1

不,这不是包装。架构对于抽象是至关重要的。 MVVM或MVP(两者都不相同)有助于抽象业务层和视图层。

我不会在这里详细说明,你可以阅读博客。

当你使用observables,比如在数据绑定,LiveData或RX observables中时,MVVM是最有用的。您只需更改viewModel中的值,并且更改将反映在UI中。您不必一次又一次地使用 textView.setText()

好了,让我们打破(让我们保持简单的事情)

查看包括活动,碎片等

视图模型负责包装的型号和准备需要观察数据由视图。它还为视图提供了将事件传递给模型的钩子。然而,ViewModel并不依赖于视图。它包含一个接口ViewModel和与不同活动关联的不同ViewModel。这是一个链接到Android ViewModel

模型保存应用程序的数据和状态。

您可以在任何地方找到这些说明。最重要的部分是为什么我们应该使用这些架构?

比方说你有一个应用程序,在那里你必须计算值的总和在两个文本字段提供,TEXTATEXTB到另一个文本字段textC

你需要一个Model类总和存储数据并显示或保存。

public class Sum{ 
public int num1,num2,sum;// make these observable. 
} 

让我们假设这是一个棘手的问题,你会喜欢在第一次对你的业务逻辑只专注,并成功地实现逻辑之后,你会移动到改变你的看法。

所以,你写你的ViewModel类

public class SumViewModel extends ViewModel{ 
// implement other required methods and variables, if possible LiveData. 
// either you can use Databinding Observable, and share the same Sum object in 
// View and ViewModel or you can use LiveData as shown in the link. 
Sum s; 
public void onSumPressed(int a, int b){ 
s.num1 = a; 
s.num2 = b; 
s.sum = a+b; 
} 
public void clearPressed(){ 
s.num1=0; 
s.num2=0; 
s.sum=0; 
} 
} 

所以,您已成功实现的业务逻辑。唷!现在,您可以专注于您的观点了

public class SumActivity extends AppcompatActivity{ 
    Sum s;// as discussed, you can make this observable. 
private SumViewModel model; 
private ActivitySumBinding binding; 
onCreate(){ 
... 
model = ViewModelProviders.of(this).get(SumViewModel.class); 
int a = Integer.parseInt(binding.text1.getText().toString()); 
int b = Integer.parseInt(binding.text2.getText().toString()); 
binding.sumBtn.setOnclickListener(v-> model.onSumPressed(a,b)); 
//Now, since the object s is being obseverd, data will be changed in the view accordingly. 
... 
} 

} 

该程序仅用于演示。

我希望您注意主要议题。我们打破了我们的目标并一次专注于一个目标。我们首先实现我们的业务逻辑,然后继续进行适当的视图更改。而且调整新的需求非常容易,因为你只需要继续添加方法。

关于MVVM的另一个优点是我们的View Model现在非常容易进行单元测试。

+0

我在这里得到了一些澄清,我会挖掘full.is MVVM比MVP更好? – Ghimire