项目地址:zskingking/Jetpack-Mvvm
简介: 使用 Jetpack 全家桶+Kotlin 实现的 Android 社区 App 加音乐播放器。不写晦涩难懂的代码,尽量标清每一行注释,严格遵守六大基本原则,大量运用设计模式,此项目可快速帮你入手 Kotlin、Jetpack。如果觉得对你有帮助,右上角点个 star,事先谢过
更多:作者 提 Bug
标签:
as 升级到 4.2 后 jdk location 默认是 11,而本项目 jdk 1.8 所以有冲突,会报java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
错误。具体解决方案 java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException after updating to Android Studio 4.2 - Stack Overflow
引入 Jetpack 架构后,你的 App 会发生哪些变化?
关于 Android 架构,你是否还在生搬硬套?
为了更深入的理解Jetpack
中各个组件,在前段时间基于Jetpack MVVM
实现了一版WanAndroid
。相比上一版的MVP
增加了夜间模式
和音乐播放器
,播放器界面仿照网易云音乐
。App
中也大量的使用属性动画让界面简约而不简陋。先上图 look 一波
基础框架选用MVVM
,选用的Jetpack
组件包括Lifecycle、ViewModel、LiveData、DataBinDing、Navigation、Room
。
项目基于Navigation
由单Activity
多Fragment
实现,使用这种模式给我最直观的感受就是快
,比如点击搜索进入搜索界面的衔接动画,在多Activity
之间是不可能这么连贯的。
整个项目全部使用Kotlin
语言,广泛应用了协程
编写了大量的扩展函数
。
关于每个模块的职责我是这样定义的:
Model
对应项目中Repository
,做数据请求以及业务逻辑。
ViewModel
基于Jetpack
中的ViewModel
进行封装(友情提示:Jetpack ViewModel
和MVVM ViewModel
没有半毛钱关系,切勿将两个概念混淆)。在项目中VM
层职责很简单,通过内部通过LiveData
做数据存储,以及结合DataBinding
做数据绑定。
View
尽量只做 UI 渲染。与MVP
中不同,View 是通过 DataBinding 与数据进行绑定,Activity
或Fragment
非常轻盈只专注于生命周期的管理,数据渲染基本全部由DataBinding+BindAdapter
实现。
关于MVVM
模版类的封装可至package com.zs.base_library.base(包名)
下查看。
网络层
关于网络层继续使用OkHttp Retrofit
,并对 Retrofit 多ApiService
以及多域名进行了封装。
数据库
项目中历史记录
是在本地数据库进行维护的,关于数据库使用了Jetpack
中的Room
。
主题切换
Android
原生提供的夜间切换好像又API
版本限制,所以就没有用。我个人在本地维护了两套主题,可动态切换。当前包含白天、夜间
两套主题
我个人是非常喜欢写注释的,基本每一个复杂的功能都有对应的文字描述
项目中运用了大量的设计模式,每用到一种设计模式
我都会结合当时场景进行解释,比如播放器中某个接口,我会这样写注释:
/**
* des 所有的具体 Player 必须实现该接口,目的是为了让 PlayManager 不依赖任何
* 具体的音频播放实现,原因大概有两点
*
* 1.PlayManager 包含业务信息,Player 不应该与业务信息进行耦合,否则每次改动都会对业务造成影响
*
* 2.符合开闭原则,如果需要对 Player 进行替换势必会牵连到 PlayManager 中的业务,因而造成不必要的麻烦
* 如果基于 IPlayer 接口编程,扩展出一个 Player 即可,正所谓对扩展开放、修改关闭
*
* @author zs
* @date 2020-06-23
*/
interface IPlayer {
....
....
}
/**
* des 音频管理
* 通过单例模式实现,托管音频状态与信息,并且作为唯一的可信源
* 通过观察者模式统一对状态进行分发
* 实则是一个代理,将目标对象 Player 与调用者隔离,并且在内部实现了对观察者的注册与通知
* @author zs
* @date 2020/6/25
*/
class PlayerManager private constructor() : IPlayerStatus {
....
....
}
此项目中你很难看到不明不白的代码。Jetpack
和Kotlin
是大势所趋,既然拒绝不了那何不开心的拥抱。功能目前已完成90%
,代码也在持续优化,欢迎大家关注、下载源代码,让我们共同学习、共同进步。