安卓-mvvm项目架构搭建(一)- 项目搭建

article/2025/9/29 16:57:11

前言

用了几百年的mvp和mvc了,这和我的业务环境脱不了关系,维护老旧项目的时间很多,导致一直没什么机会来写一个mvvm标准架构的应用,

我开个帖子记录一下使用安卓组件化和mvvm模式来从头做一个项目

开始

1.将会使用jectpact来作为核心的库,这是一个安卓官方出品的帮助mvvm搭建的库。

将会使用开眼的openapi来进行编写,项目中所有api接口都是抓取自开眼app,目前最新版的开眼api是加了验证的,但是所有版权均归属开眼app所有,仅供学习借鉴使用,请勿用做商业用途,若有侵权,请联系作者删除。

2.使用阿里巴巴开源的Arouter来作为在组件之间进行交互的框架。

3.注意可能含有低质量代码

目录结构


在这里插入图片描述


依赖关系

在这里插入图片描述

这些模组尽量做到互相不影响,app入口的模组在open_main里,里面包含整个app的ui页面框架,而名称为app的模组只是存放自定义的application域做一些初始化操作和到欢迎界面的操作而已。

MVVM工具编写

上面搭建好项目后,进行一个简单mvvm的工具编写。

mvvm是界面与数据模型进行的一个双向绑定,这里面我们的着重点就是绑定后在数据更新结束时能进行对视图的变化,

这里我们使用安卓jectpack里的viewmodel来进行视图双向绑定,viewmodel它的好处是可以完美契合数据模型与ui视图的生命周期

有效减少了内存泄漏的问题,我这里简单的利用retrofit+viewmodel来写一个典型的mvvm通信。

代码示例

1.view层

SplashActivity(开屏页面,加载广告)

@Route(path=UiPaths.Splash.path)
class SplashActivity : AppCompatActivity() {
var configBean:ConfigBean?=null
lateinit var videoView: SplashVideoView
var mVideoWidth:Int = 0
var mVideoHeight:Int = 0
lateinit var viewModel:ViewModelCenter
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_splash)videoView = findViewById(R.id.video_view)//隐藏状态栏hiddeBar()//加载开屏视频广告laodingopeningVideo()}private fun laodingopeningVideo() {//这里viewmodel与视图绑定viewModel = ViewModelCenter()//初始化viewmodelviewModel.init(ConfigBean::class.java)//在这里对数据进行与视图的互动viewModel.data.observe(this,{if (it is String){ToastUtils.showShort(it)}else{videoView.setActivity(this)videoView.setAdConfig(it as ConfigBean)}})}override fun onBackPressed() {if (Jzvd.backPress()) {return}super.onBackPressed()
}override fun onPause() {super.onPause()Jzvd.releaseAllVideos()
}
}

2.viewmodel层

ViewModelCenter

按照正常的写法应该是一个model对应一个具体的viewmodel而不是我这种写法,因为项目体量不大所以这边就暂时不采用正规的写法。

viewmodel层包含数据处理和数据存放的空间,我们可以执行网络请求来获取数据

/**
不用单例@param*/
public class ViewModelCenter extends ViewModel
{private NetWorkCenter center;public static final String LOADING_STATUE="LOADING_STATUE";public static final String FAILED_STATUE="FAILED_STATUE";public static final String SUCCESS_STATUE="SUCCESS_STATUE";public static final String OTHER_STATUE="OTHER_STATUE";public MutableLiveData<String> loading_statue=new MutableLiveData<>();public MutableLiveData data = new MutableLiveData<>();public ViewModelCenter(){center = new NetWorkCenter(this);loading_statue.setValue(LOADING_STATUE);}/*** 初始化方法* 按照传统的请求网络查询* 可以传入参数在其中*/public void init(Class clazz){center.startRequest(clazz);}/*** 初始化方法* 按照传统的请求网络查询* 可以传入参数在其中*/public void init(Class clazz,int page,int pagesize){center.startRequest(clazz,page,pagesize);}}

3.viewmodel层里的网络服务处理层

通过在viewmodel里init方法获取的model名称来请求对应的接口,最后在回调里进行数据的处理

利用了Gson来处理请求获取到的响应,数据处理代码就不贴了。

class NetWorkCenter(modelCenter: ViewModelCenter)
{var modelCenter_: ViewModelCenter = modelCenter
fun<T>  startRequest(initModel:Class<T>) {when(initModel.name){CommnutiyPageBean::class.java.name->{ApiService.startRequest().getHomePage().enqueue(NetResult(modelCenter_))}DayDataPageBean::class.java.name->{ApiService.startRequest().getDayData().enqueue(NetResult(modelCenter_))}CategoryList::class.java.name->{ApiService.startRequest().getCategories().enqueue(NetResult(modelCenter_))}DisCoverPageBean::class.java.name->{ApiService.startRequest().getDiscover().enqueue(NetResult(modelCenter_))}ConfigBean::class.java.name->{ApiService.startRequest().getAdConfigs().enqueue(NetResult(modelCenter_))}}
}fun<T>  startRequest(initModel: Class<T>,page:Int,pageSize:Int) {}
}

4.model层

很普通的一个javabean对象,利用gson解析可以生成对应对象

public class CommnutiyPageBean
{@SerializedName("itemList")private List<ItemListDTOX> itemList;@SerializedName("count")private int count;@SerializedName("total")private int total;@SerializedName("nextPageUrl")private String nextPageUrl;@SerializedName("adExist")private boolean adExist;public List<ItemListDTOX> getItemList() {return itemList;}public void setItemList(List<ItemListDTOX> itemList) {this.itemList = itemList;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public String getNextPageUrl() {return nextPageUrl;}public void setNextPageUrl(String nextPageUrl) {this.nextPageUrl = nextPageUrl;}public boolean isAdExist() {return adExist;}public void setAdExist(boolean adExist) {this.adExist = adExist;}}

目前先告一段落,小弟学艺不精,看看就好,有什么不足的地方还请大哥们提出来


http://chatgpt.dhexx.cn/article/bjbkWkf7.shtml

相关文章

android mvvm架构-基于Jetpack

2020年最新最实用的android-MVVM框架 https://github.com/VcStrong/JetpackMVVM.git 注册的密码规则是数字加字母超过8位即可 测试账号&#xff1a;13126965106 密码&#xff1a;111111aa 阅读此文档前&#xff0c;先尝试运行项目&#xff0c;文档中部分类名需要结合项目中代码…

安卓如何搭建Mvvm框架

安卓架构从我们最初熟悉的Mvc模式&#xff0c;发展到用Mvp&#xff0c;再到现在比较火的Mvvm架构。一路走来感觉架构都是浮云&#xff0c;最主要的还是个人对业务的理解深入&#xff0c;然后再进行代码的封装解耦&#xff0c;才能真正是代码逻辑简洁和维护成本减小。 下面我们就…

mvnw,到底是什么鬼?

不羡鸳鸯不羡仙&#xff0c;一行代码调半天。原创&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;&#xff0c;欢迎分享&#xff0c;转载请保留出处。 使用start.spring.io生成项目&#xff0c;会发现里面有mvnw和mvnw.cmd两个文件。两个文件加…

SpringBoot创建项目生成的maven-wrapper(mvnw)

1 生成 用https://start.spring.io/生成Spring Boot初始项目后&#xff0c;会生成几个文件&#xff1a; . |-- .mvn | -- wrapper | |-- maven-wrapper.jar | – maven-wrapper.properties |-- mvnw |-- mvnw.cmd 在一些项目中并没有这几个文件&#xff0c;可见它们不是必须的…

Android MVI框架的使用

AndroidMviFrame AndroidMviFrame 是一个Android简单易用的项目框架 文档下面会对框架中所使用的一些核心技术进行阐述。该框架作为技术积累的产物&#xff0c;会一直更新维护&#xff0c;如果有技术方面的谈论或者框架中的错误点&#xff0c;可以在 GitHub 上提 Issues&…

关于Maven ./mvnw

文章目录 寻找找到帮助命令./mvnw是什么?add:该命令成功运行.后来?失败 寻找 C:\Users\71027>mvn /? [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ---------------…

Android MVVM架构

1.MVC,MVP,MVVVM 1.1什么是MVVM 1.MVVM&#xff0c;是Model-View-ViewModel的简写&#xff0c;是M-V-VM三部分组成。它本质上就是MVC 的改进 版。MVVM 就是将其中的View 的状态和行为抽象化&#xff0c;其中ViewModel将视图 UI 和业务逻辑分 开&#xff0c;它可以取出 Model …

Maven(mvn)的学习下载和配置

文章目录 Maven&#xff08;mvn&#xff09;1.Maven 是什么&#xff1f;2.Maven做什么&#xff1f;2.1传统方式对项目的管理2.2Maven对jar包的管理 3.Maven怎么学3.1Maven如何创建项目3.2Maven的下载与配置3.3Maven的项目结构3.4Maven依赖的引入3.5Maven依赖的剔除3.6Maven依赖…

Android之 MVC到MVVM架构发展和封装

一 简介 1.1 软件架构发展趋势是解耦&#xff0c;即分离数据层和视图层&#xff0c;使得数据层专注于业务的数据和逻辑处理。从而提高代码的可读可编辑效率&#xff0c;提高团队协作能力&#xff0c;项目的生产能力&#xff0c;降低后期维护成本。 1.2 Android架构发展MVC -…

安卓mvvm

AndroidX的意思是android extension libraries, 也就是安卓扩展包 AndroidX其实是Jetpack类库的命名空间 (190条消息) AndroidX初识_Neda Wang的博客-CSDN博客https://blog.csdn.net/weixin_38261570/article/details/111500044 viewmodel Android 面试总结 - ViewModel - 知…

Android MVVM的实现

Android MVVM的实现 前言&#xff1a; 在我们写一些项目的时候&#xff0c;通常会对一些常用的一些常用功能进行抽象封装&#xff0c;简单例子&#xff1a;比如BaseActivity&#xff0c;BaseFragment等等…一般这些Base会去承载一些比如标题栏&#xff0c;主题之类的工作&…

Android MVI框架搭建与使用

MVI框架搭建与使用 前言正文一、创建项目① 配置AndroidManifest.xml② 配置app的build.gradle 二、网络请求① 生成数据类② 接口类③ 网络请求工具类 三、意图与状态① 创建意图② 创建状态 四、ViewModel① 创建存储库② 创建ViewModel③ 创建ViewModel工厂 五、UI① 列表适…

Android MVVN 使用入门

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种基于数据绑定的设计模式&#xff0c;它与传统的 MVC 和 MVP 模式相比&#xff0c;更加适合处理复杂的 UI 逻辑和数据展示。在 Android 开发中&#xff0c;MVVM 通常使用 Data Binding 和 ViewModel 实现。 下面是一个简…

mvnw的使用

1、什么是mvnw mvnw是Maven Wrapper的缩写。我们安装Maven时&#xff0c;默认系统所有项目都会使用全局安装的这个Maven版本。但对于某些项目来说&#xff0c;它可能必须使用某个特定的Maven版本&#xff0c;这时就可以使用Maven Wrapper&#xff0c;它可以负责给这个特定的项…

快速查找参考文献影响因子——ScholarScope

前言&#xff1a; 最初看到的关于查看影响因子的插件有&#xff1a;pubmedy, pubmed plus 和 scholar scope. 试了pubmedy&#xff0c;找到的版本没有用。 PubMed 是一个提供生物医学方面的论文搜寻以及摘要&#xff0c;并且免费搜寻的数据库。它的数据库来源为MEDLINE。其核心…

新手刚学js遇到的ie6问题

2019独角兽企业重金招聘Python工程师标准>>> 1.前段时间遇到一个需求&#xff0c;需要让图片在点击tab的时候加载。如果那个tab是由a标签组成的&#xff0c;这时候你就需要在click之后return false。不然坑爹的ie6是没法显示图片的。 2.有个需求是&#xff0c;做一…

查看文章影响因子的插件_查询文献可实时显示影响因子与分区排名的2个强大浏览器插件...

首先,看下我们普通的PubMed文献查找页面,是下图这样子的: 可是装了两个国产神器之后,文献的检索结果列表是下图这样的,可以实时查看文章的影响因子、研究领域的排名,以及全文下载链接、引文格式等。 而这两个神器其实只是两款非常小的浏览器插件:PubMedy和Scholarscope。…

python 贪吃蛇游戏代码

第一步&#xff1a;蛇形 运行IDLE&#xff0c;打开一个新的文本编辑窗口。输入以下的代码&#xff1a; # -*- coding: UTF-8 -*- # 1 - 引入模块 import pygame from pygame.locals import * import sys,random,time,math# 2 - 初始化pygame pygame.init() fpsClock pygame.…

简单的贪吃蛇

最近都在忙着复习考试&#xff0c;忙里偷闲&#xff0c;抽出时间写了个贪吃蛇&#xff0c;没时间写详细的思路了&#xff0c;代码里有比较详细的注释&#xff0c;有兴趣的同学可以自己看看。&#xff08;感觉写的相对来说还是比较简短的&#xff0c;如果有什么写的不好或是不对…

简单的贪吃蛇代码,可上机运行

贪吃蛇无敌版&#xff0c;可穿墙&#xff0c;英文输入法小写字母wasd操作。 #include<stdio.h> #include<string.h> #include<windows.h> #include<time.h> #include<conio.h>#define up w #define down s #define left a #define right d #def…