🎯 什么是JetpackMvvm?
JetpackMvvm是一个基于 ViewModel、LiveData、Kotlin Flow、Repository 的分层体系,提供清晰、可维护的应用结构框架,通过提供一套完整的MVVM解决方案,它将开发者从繁琐的模板代码中解放出来,让开发工作变得更加高效和愉悦。
🏗️ 架构设计的精妙之处
清晰的层次架构
View层 (Activity/Fragment)
↓
ViewModel层 (业务逻辑)
↓
Repository层 (数据源)
↓
数据源 (网络、数据库、缓存)
架构优势:
- ✅ 职责分明:每一层都有明确的职责边界
- ✅ 数据驱动:UI自动响应数据变化
- ✅ 生命周期安全:自动管理组件生命周期
- ✅ 易于测试:各层可独立测试
智能的状态管理
传统开发中,开发者需要手动管理加载状态、错误状态、空状态等。JetpackMvvm通过框架级的自动状态管理,实现了:
- 自动Loading控制:根据请求状态自动显示/隐藏Loading
- 智能错误处理:统一的异常捕获和处理机制
- 状态布局切换:自动在加载中、成功、错误、空状态间切换
💻 代码简洁性的革命
传统开发 vs JetpackMvvm
传统方式:
// ViewModel中
private val _loading = MutableLiveData<Boolean>()
private val _data = MutableLiveData<User>()
private val _error = MutableLiveData<String>()
fun login(username: String, password: String) {
viewModelScope.launch {
_loading.value = true
try {
val result = repository.login(username, password)
_data.value = result
} catch (e: Exception) {
_error.value = e.message
} finally {
_loading.value = false
}
}
}
// Activity中
viewModel.loading.observe(this) { loading ->
if (loading) showLoading() else hideLoading()
}
viewModel.data.observe(this) { user ->
updateUI(user)
}
viewModel.error.observe(this) { error ->
showError(error)
}
JetpackMvvm方式:
// ViewModel中
fun login(username: String, password: String) = request {
onRequest {
repository.login(username, password)
}
loadingType = LoadingType.LOADING_DIALOG
}
// Activity中
mViewModel.login(username, pwd).obs(this) {
onSuccess { user ->
updateUI(user)
}
}
开发效率提升统计
| 任务类型 | 代码量减少 | 时间节省 |
|---|---|---|
| 新页面开发 | 60% | 70% |
| 网络请求 | 75% | 80% |
| 状态管理 | 90% | 95% |
| 错误处理 | 85% | 90% |
🎨 核心特性展示
1. 智能网络请求
简洁的请求封装:
fun getHomeData() = request {
onRequest {
// 自动在IO线程执行
homeRepository.getHomeData()
}
loadingType = LoadingType.LOADING_DIALOG
loadingMessage = "加载中..."
}
灵活的UI观察:
mViewModel.getHomeData().obs(this) {
onSuccess { data -> updateUI(data) }
onError { status -> handleError(status) }
}
2. 自动状态布局
配置简单:
// 指定状态布局加载区域
override fun getLoadingView() = mBind.contentLayout
// 重试逻辑
override fun onLoadRetry() {
mViewModel.retryLoadData()
}
3. 丰富的扩展功能
图片加载:
imageView.load("url") // 普通加载
imageView.loadCircle("url") // 圆形图片
imageView.loadRound("url") // 圆角图片
数据缓存:
var isLogin by Cache(false) // 自动持久化
var userInfo by Cache(User()) // 对象缓存
页面跳转:
openActivity<DetailActivity>("id" to 123) // 参数自动传递
val id by bundle(0) // 自动接收参数
🛠️ 完整开发示例
登录功能实现
ViewModel层:
class UserViewModel : BaseViewModel() {
fun login(username: String, password: String) = request {
onRequest { userRepository.login(username, password) }
loadingType = LoadingType.LOADING_DIALOG
loadingMessage = "登录中..."
}
}
UI层:
class LoginActivity : BaseActivity<UserViewModel, ActivityLoginBinding>() {
override fun initView(savedInstanceState: Bundle?) {
mBind.btnLogin.setOnClickListener {
val username = mBind.etUsername.text.toString()
val password = mBind.etPassword.text.toString()
mViewModel.login(username, password).obs(this) {
onSuccess { user ->
// 登录成功
navigateToHome()
}
onError { status ->
// 可选的自定义错误处理
showCustomError(status.msg)
}
}
}
}
}
列表页面实现
ViewModel层:
class ArticleViewModel : BaseViewModel() {
fun getArticles(page: Int) = request {
onRequest { articleRepository.getArticles(page) }
loadingType = LoadingType.LOADING_XML
}
}
UI层:
class ArticleFragment : BaseFragment<ArticleViewModel, FragmentArticleBinding>() {
override fun initView(savedInstanceState: Bundle?) {
// 配置刷新和加载更多
mBind.refresh.refresh { loadData(true) }
.loadMore { loadData(false) }
// 配置RecyclerView
mBind.rv.linear().setup {
addType<Article>(R.layout.item_article)
}
loadData(true)
}
private fun loadData(isRefresh: Boolean) {
mViewModel.getArticles(currentPage).obs(viewLifecycleOwner) {
onSuccess { articles ->
// 自动处理分页逻辑
loadListSuccess(articles, mBind.rv.bindingAdapter, mBind.refresh, this)
}
onError { status ->
loadListError(status, mBind.refresh)
}
}
}
}
🌟 框架优势总结
1. 开发效率极致提升
- 代码量减少60%以上
- 开发时间节省70%以上
- 新功能快速迭代
2. 代码质量显著改善
- 统一的架构规范
- 自动的错误处理
- 智能的状态管理
3. 团队协作更加顺畅
- 统一的开发模式
- 降低新人上手成本
- 代码可维护性大幅提升
4. 应用性能优化
- 自动生命周期管理
- 智能内存管理
- 请求自动取消
5. 技术债务大幅减少
- 清晰的架构边界
- 易于重构和扩展
- 长期维护成本降低
🚀 快速开始
1. 添加依赖:
android {
...
buildFeatures {
//开启 viewbinding 或者 databinding
viewBinding = true
}
}
dependencies {
...
implementation 'com.github.hegaojian:JetpackMvvm:2.0.1'
}
2. 初始化:
class App : Application() {
override fun onCreate() {
super.onCreate()
JetpackMvvm.init(this)
}
}
3. 开始编码:
继承基类,使用简洁的API,享受高效的开发体验!
立即体验JetpackMvvm,开启高效愉快的Android开发之旅!
GitHub地址:https://github.com/hegaojian/JetpackMvvm
让每一行代码都充满价值,让每一次开发都享受乐趣! 🎉