重新构建711的Android项目(二),架构的选择与实现

时间:2022-07-22
本文章向大家介绍重新构建711的Android项目(二),架构的选择与实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

看过太多的关于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一一对应操作一个界面。