KtArmor-MVVM

项目地址:hyzhan43/KtArmor-MVVM 

简介: :ghost: Android 快速开发框架, KtArmor 寓意着 为 Android 赋予战斗装甲, 方便开发者快速进行 Android 开发。

更多:作者   提 Bug

标签:

转存失败重新上传取消

学习了 Kotlin 有一段时间了, 每次写项目/Demo 的时候, 总是用到网络请求MVPMVVM常用工具类通用自定义 View, 索性把这些整合到一起, 搭成一个 Android 的脚手架——KtArmor. 框架是我个人经验的积累, 总结. 如有不妥, 望各位大佬指出.

什么是 KtArmor ?

KtArmor 寓意着 为 Android 赋予战斗装甲, 方便开发者快速进行 Android 开发。节约开发者开发时间。

  • 架构模式MVVM + Kotlin + Androidx + ViewModel + LiveData
  • 网络请求Retrofit + Okhttp + Coroutine + RxJava + DataBinding
  • 代码:简洁优雅, 易扩展
  • 文档: 有相关的 KtArmor-MVVM 系列文档说明 (后续补充)
  • 功能:
    • 基本IActivityIFragment
    • MVVM 框架封装 IMvmActivityIMvmFragmentBaseViewModelBaseRepository封装
    • 网络请求封装 BaseOkHttpClientBaseRetrofitRetrofitFactory
    • 常用控件PlaceHolderView(占位布局), LoadingView(加载框)
    • 常用扩展封装 KtWing 框架(SharedPreferencesStartActivityLogToast(不重复显示))等
    • ....

亮点 1——无需初始化

一般而言,使用第三方框架都需要进行相关初始化操作。如下:

class BaseApplication: Application(){override fun onCreate() {super.onCreate()// 初始化 KtArmor (不再需要)// KtArmor.init(this, MyRetrofitConfig()) }
}

若无需定制 Retrofit 相关配置的话,KtArmor-MVVM 会自动初始化,无需手动 init

亮点 2——无需继承

大部分的 Android 快速开发的脚手架,都是需要继承 BaseXXXActivityXXXActivity 等 Activity 封装的基类,但是这往往不能解决多继承的问题,也这样大大限制了开发者自由,所以在 KtArmor-MVVM 框架中,采用了 接口的形式,无需继承 BaseXXXActivity,实现对应接口(IActivity,IMvmActivity) 即可,后面有相关 Login 使用教程例子参考。

亮点 3——自动“注入”

@BindViewModel

class LoginActivity : AppCompatActivity(), IMvmActivity {@BindViewModel  // 看这里!!lateinit var viewModel: LoginViewModel//...省略其他
}

通过 @BindViewModel 注解 viewModel 变量,KtArmor-MVVM 通过反射,自动创建 LoginViewModel实例, 并赋值给 viewModel 变量。直接使用即可!

@BaseUrl

@BaseUrl(API.BASE_URL)  // 看这里!!
interface ApiService {@POST(API.LOGIN)suspend fun login(@Query("username") username: String,@Query("password") password: String): BaseResponse<LoginRsp>
}

我们通常使用 Retrofit 的时候,都会创建对应 Service 接口类, 通过在 Service 上 标识 @BaseUrl 注解,并传入 对应 baseUrl,KtArmor-MVVM 就会将 baseUrl “注入” 到 Retrfit 中。目前只是针对单个 baseUrl, 后续将考虑多个 baseUrl 动态切换的相关处理。

KtArmor-MVVM 框架引入

注意!

  • 由于采用了Androidx, 所以如果不是 Androidx 的话, 引入会有兼容性问题(会报错!).
  • 版本: minSdkVersion 19

以下默认是Androidx 项目下引入

先在 build.gradle(Project:XXXX) 的 repositories 添加:

allprojects {repositories {...maven { url "https://jitpack.io" }}
}

然后在 build.gradle(Module:app) 的 dependencies 添加:

implementation 'com.hyzhan:KtArmor:1.0.7' //最新版本

快速上手

我们先从一个 简单登录功能来熟悉一下 KtArmor-MVVM 使用流程。

LoginActivity

class LoginActivity : AppCompatActivity(), IMvmActivity {@BindViewModellateinit var viewModel: LoginViewModeloverride fun getLayoutId(): Int = R.layout.activity_loginoverride fun initListener() {mBtnLogin.setOnClickListener {viewModel.login(mEtAccount.str(), mEtPassword.str())}}override fun dataObserver() {viewModel.loginData.observe(this, Observer {toast("登录成功")})}
}
  • 1、新建一个 LoginActivity 类,并实现 IMvmActivity “接口”

  • 2、然后使用 @BindViewModel 绑定一个 ViewModel,KtArmor-MVVM 会自动注入赋值。

  • 3、getLayoutId()方法,返回一个 R.layout.activity_login (布局 id)

  • 4、initListener()方法中设置 登录按钮事件 (mBtnLogin),通过 viewModel 来发起网络请求。

  • 5、然后 在 dataObserver()监听回调的结果即可。

然后我们再来看看, VM 层如何实现,也就是 LoginViewModel。

LoginViewModel

class LoginViewModel : BaseViewModel<LoginRepository>() {val loginData = MutableLiveData<LoginRsp>()fun login(account: String, password: String) {// 校验参数if (TextUtils.isEmpty(account) || TextUtils.isEmpty(password)) {showToast(R.string.account_or_password_empty)return}// DSL 方式发起 网络请求quickLaunch<LoginRsp> {onStart { showLoading() }request { repository.login(account, password) }onSuccess { loginData.value = it }}}
}
  • 需创建 LoginViewModel 类,继承BaseViewModel,并传入 LoginRepository,自动注入 LoginRepositoy 实例。
  • quickLaunch<XXX> 方法是使用 DSL 方式发起网络请求
  • repository login 方法真正发起网络请求
  • onSuccess() 方法 监听回调结果,并设置给 LoginData

最后,我们来看看 Repository 的处理。

LoginRepository

// 注意这里!
@BaseUrl(API.BASE_URL)
interface ApiService {@POST(API.LOGIN)suspend fun login(@Query("username") username: String,@Query("password") password: String): BaseResponse<LoginRsp>
}// ServiceFactory.kt
object ServiceFactory {// 初始化 ApiServiceval apiService by lazy { RetrofitFactory.create(ApiService::class.java) }
}// LoginRepository.kt
class LoginRepository {suspend fun login(account: String, password: String): BaseResponse<LoginRsp> {return ServiceFactory.apiService.login(account, password)}
}
  • 创建一个 ApiService,这里需要在 class 类上 设置 @BaseUrl 注解,value 值为 baseUrl,其他按照正常 retrofit 使用即可。
  • 然后使用 RetrofitFactory.create() 来创建对应 ApiService。RetrofitFactory 封装了Retrofit 创建流程。
  • 最后 在 LoginRepository 中即可使用 ServiceFactory.apiService.login 来发起网络请求即可。

期待

KtArmor-MVVM 框架是一款小而美的框架,也是我个人经验的积累, 总结,希望大家喜欢。

如果你有更好的建议欢迎 pr,issues 一起交流学习。

如有不妥, 望各位大佬指出。

示例项目

Kotlin 版 玩 Android

其他相关

Kotlin 的魔能机甲——KtArmor(一)

Kotlin 的魔能机甲——KtArmor 插件篇(二)

Kotlin 的魔能机甲——KtArmor(三)

Kotlin 的魔能机甲——KtArmor 网络调用封装(四)

Android 快速开发框架, KtArmor 寓意着 为 Android 赋予战斗装甲, 方便开发者快速进行 Android 开发。相关推荐

  1. Android快速开发框架之xUtils---图片模块

    本篇博客将介绍一下xUtils的图片模块,想要学习的小伙伴请先看第一篇注解模块完成第一第二步哦. Android快速开发框架之xUtils-注解模块:http://blog.csdn.net/a_zh ...

  2. Android快速开发框架之xUtils---数据库模块

    本篇博客将介绍一下xUtils的数据库模块,想要学习的小伙伴请先看第一篇注解模块完成第一第二步哦. Android快速开发框架之xUtils-注解模块:http://blog.csdn.net/a_z ...

  3. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  4. Winform UI框架 | Winform界面快速开发框架

    Winform UI框架 | Winform界面快速开发框架 什么是Winform? WinForm是.Net开发平台中对Windows Form的一种称谓,Windows窗体可用于设计窗体和可视控件 ...

  5. 快速开发框架为什么得到越来越多企业的认同?

    随着企业信息化要求的不断增加,快速开发框架以其迅速性,便捷性,以及良好的可拓展性得到了越来越多企业的认可. 在传统的开发模式下,完成一个完整的项目一般需要高级架构员+专业美工人员+数据调优人员+软件工 ...

  6. Ultimate++是一个C++跨平台应用快速开发框架

    Ultimate++是一个C++跨平台应用快速开发框架 U++是一个注重提高编程效率的C++跨平台应用快速开发框架,包括一系列库(GUI. SQL等)和一个集成开发环境. 快速开发是通过智能.主动使用 ...

  7. Android 最火的快速开发框架XUtils

    最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活跃 功能比较完善的一个框架,是基于afinal开发的,比afinal稳定性提高了不少,下面是介绍: 鉴于大家的热情,我又写了一篇 ...

  8. android的快速开发框架,FastAndroid

    软件简介 这是一个封装了多方面开源库后基于MVP模式的一个Android快速开发框架,融入了MVP模式,将Activity或Fragment做为View层.抽象出Presenter用于处理业务逻辑.M ...

  9. Android快速开发框架-ZBLibrary 源码分享

    2019独角兽企业重金招聘Python工程师标准>>> 坐标标准库ZBLibrary,是一个MVP架构的Android快速开发框架,提供一套开发标准(View,Data,Event) ...

最新文章

  1. java百度云推送demo_百度云推送java服务端maven安装完整demo
  2. Deep Belief Networks
  3. python_文件操作代码实例
  4. php 数据映射,数据映射模式(Data Mapper)
  5. 基金一般拿多长时间合适?
  6. 人工智能python的缺点_浅谈人工智能的优缺点及使用环境
  7. 喜庆普通铁路也要跑动车了
  8. 车辆网之整车Can网络基本结构及转发机制
  9. oracle同义词表不存在,同义词什么时候失效呢?
  10. bgp 服务器 验证,什么是所谓的BGP协议_BGP服务器指什么?
  11. 解决Aid Learning无法联网问题
  12. 虚拟机更新升级,原来的GuestAdditions versions版本不匹配
  13. 3dmax:3dmax中的快捷键集合大全(分门别类,建议收藏)
  14. 诸如(1234568) 0xFF这类
  15. TiDB 在北京银行交易场景中的应用实践
  16. 二代测序的原理和简介
  17. 【SSLGZ 1614】医院设置(Dijkstra)
  18. Java使用数组几个数字比较大小进行排序
  19. POJ - 4048 Chinese Repeating Crossbow 暴力枚举+线段香蕉?
  20. SpringBoot如何打包项目?

热门文章

  1. win10启动nginx极简
  2. 云栖科技评论第22期:DeepMind官方确认Master身份:就是 AlphaGo!
  3. 瑞萨单片机解调好盈电调控制无刷电机
  4. vb实验用计算机安排考试日程,vb实验报告副本.docx
  5. 防止文件泄露,教你如何识别文件类型
  6. 踏足Flutter 安装开发环境
  7. js 获取元素文本_JS第三天
  8. Java中的Stream API简述
  9. IPv6即将来临,IPv6的信息安全?
  10. 守护进程(内核线程和普通进程)