看过太多的关于Android架构方面的文章,也深知一个好架构的重要性。
如果一开始代码没有好多架构,就是前人挖坑,后人掉坑里。因为随着代码和业务的增多,看到的混乱与不合理,会让人进入进退两难的境地,无法取舍。弃之可惜,从头来没精力。
这里选择了Android项目中流行的MVVM架构。使用Android官方最新的LiveData和ViewModel,再加上Databinding。
单纯的使用Databinding实现的MVVM缺点太多,不好驾驭。并且无法感知Activity的生命周期导致应用可能出问题,不稳定。
以及在结构上单单使用Databinding,代码实现的结构依旧是很混乱,结构不清晰。
而使用LiveData和ViewModel,再加上Databinding的好处,可以做的让代码结构看起来特别的清晰,且View和Viewmode完全隔离。可以让前后端分离,也便于协作和单元测试。结构清晰。
一个ViewMode对应操作一个界面,持有该界面下用到的所有数据。
Android官方推荐的大致框图:
google Android的官方视频教程也强烈推荐使用ViewModel,使用它来持有Activity的所有数据。
我的结构框图如下:
以一个例子举例:
假如有一个Activity,对应的layout为activity_main.xml ,且里面Include了有一个include_main_card.xml.
那么代码结构上,有一个CardViewModel与之一一对应,且用到的数据也在CardViewModel中一一定义。
如下:
package com.example.yang.testmvvm.viewmodel; import android.arch.lifecycle.MutableLiveData; import android.arch.lifecycle.ViewModel; public class CardViewModel extends ViewModel { private final MutableLiveData<Boolean> isShow1 = new MutableLiveData<>(); private final MutableLiveData<String> payState = new MutableLiveData<>(); private final MutableLiveData<String> opFare = new MutableLiveData<>(); private final MutableLiveData<String> discFare = new MutableLiveData<>(); //卡号 private final MutableLiveData<String> cardAsn = new MutableLiveData<>(); //账户余额 private final MutableLiveData<String> oldBalance = new MutableLiveData<>(); public CardViewModel() { isShow1.postValue(false); opFare.postValue("0.00"); discFare.postValue(""); payState.postValue("请刷卡支付"); } public MutableLiveData<Boolean> getIsShow1() { return isShow1; } public MutableLiveData<String> getPayState() { return payState; } public MutableLiveData<String> getOpFare() { return opFare; } public MutableLiveData<String> getDiscFare() { return discFare; } public MutableLiveData<String> getCardAsn() { return cardAsn; } public MutableLiveData<String> getOldBalance() { return oldBalance; } }
,在MainActivity的oncreate中进行绑定,
protected ActivityMainBinding binding; CardViewModel cardViewModel;
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
cardViewModel = ViewModelProviders.of(this).get(CardViewModel.class);
binding.includeMainCard.setCardviewModel(cardViewModel);
binding.setLifecycleOwner(this);
接下来操作界面全部通过cardViewModel
来操作。
比如,设置界面上显示的金额,只需
cardViewModel.getOldBalance().postValue(String.format("%10.2f",(double)(info.lOldPurseBalance/100)));
再来看下layout布局文件里,
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="cardviewModel" type="com.example.yang.testmvvm.viewmodel.CardViewModel"/> <import type="android.view.View"/> </data> <!-- *********************卡信息展示开始*********************** --> <LinearLayout android:id="@+id/ll_cardinfo" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:visibility="@{cardviewModel.isShow1?View.VISIBLE:View.GONE}" >
只出现了一个与之对应的CardViewModel,
是不是很清晰?
总而言之,言而总之,一个ViewModel一一对应操作一个界面。