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

简介: 重新构建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一一对应操作一个界面。


相关文章
|
21天前
|
监控 安全 API
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
本文详细介绍了PaliGemma2模型的微调流程及其在目标检测任务中的应用。PaliGemma2通过整合SigLIP-So400m视觉编码器与Gemma 2系列语言模型,实现了多模态数据的高效处理。文章涵盖了开发环境构建、数据集预处理、模型初始化与配置、数据加载系统实现、模型微调、推理与评估系统以及性能分析与优化策略等内容。特别强调了计算资源优化、训练过程监控和自动化优化流程的重要性,为机器学习工程师和研究人员提供了系统化的技术方案。
141 77
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
|
16天前
|
Serverless 决策智能 UED
构建全天候自动化智能导购助手:从部署者的视角审视Multi-Agent架构解决方案
在构建基于多代理系统(Multi-Agent System, MAS)的智能导购助手过程中,作为部署者,我体验到了从初步接触到深入理解再到实际应用的一系列步骤。整个部署过程得到了充分的引导和支持,文档详尽全面,使得部署顺利完成,未遇到明显的报错或异常情况。尽管初次尝试时对某些复杂配置环节需反复确认,但整体流程顺畅。
|
24天前
|
缓存 Kubernetes 容灾
如何基于服务网格构建高可用架构
分享如何利用服务网格构建更强更全面的高可用架构
|
1月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
2月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
1月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
122 5
|
30天前
|
监控 安全 持续交付
构建高效微服务架构:策略与实践####
在数字化转型的浪潮中,微服务架构凭借其高度解耦、灵活扩展和易于维护的特点,成为现代企业应用开发的首选。本文深入探讨了构建高效微服务架构的关键策略与实战经验,从服务拆分的艺术到通信机制的选择,再到容器化部署与持续集成/持续部署(CI/CD)的实践,旨在为开发者提供一套全面的微服务设计与实现指南。通过具体案例分析,揭示如何避免常见陷阱,优化系统性能,确保系统的高可用性与可扩展性,助力企业在复杂多变的市场环境中保持竞争力。 ####
42 2
|
30天前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
1月前
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
54 1