android kt框架,GitHub - bitxiao/KtArmor-MVVM: Android快速开发框架, KtArmor 寓意着 为Android 赋予战斗装甲, 方便开发者快速进行An...-程序员宅基地

技术标签: android kt框架  

68747470733a2f2f6a69747061636b2e696f2f762f68797a68616e34332f4b7441726d6f722d4d56564d2e737667

前言

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

什么是KtArmor ?

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

架构模式: MVVM + Kotlin + Androidx + ViewModel + LiveData

网络请求: Retrofit + Okhttp + Coroutine + RxJava + DataBinding

代码:简洁优雅, 易扩展

文档: 有相关的KtArmor-MVVM 系列文档说明 (后续补充)

功能:

基本IActivity、IFragment

MVVM框架封装 IMvmActivity、IMvmFragment、BaseViewModel、BaseRepository封装

网络请求封装 BaseOkHttpClient、BaseRetrofit、RetrofitFactory

常用控件PlaceHolderView(占位布局), LoadingView(加载框)

常用扩展封装 KtWing 框架(SharedPreferences、StartActivity、Log、Toast(不重复显示))等

....

亮点1——无需初始化

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

class BaseApplication: Application(){

override fun onCreate() {

super.onCreate()

// 初始化KtArmor (不再需要)

// KtArmor.init(this, MyRetrofitConfig())

}

}

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

亮点2——无需继承

大部分的 Android 快速开发的脚手架,都是需要继承 BaseXXXActivity、XXXActivity 等 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

}

我们通常使用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 添加:

68747470733a2f2f6a69747061636b2e696f2f762f68797a68616e34332f4b7441726d6f722d4d56564d2e737667

implementation 'com.github.hyzhan43:KtArmor-MVVM:1.0.8' //查看最新版本

快速上手

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

LoginActivity

class LoginActivity : AppCompatActivity(), IMvmActivity {

@BindViewModel

lateinit var viewModel: LoginViewModel

override fun getLayoutId(): Int = R.layout.activity_login

override 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() {

val loginData = MutableLiveData()

fun login(account: String, password: String) {

// 校验参数

if (TextUtils.isEmpty(account) || TextUtils.isEmpty(password)) {

showToast(R.string.account_or_password_empty)

return

}

// DSL 方式发起 网络请求

quickLaunch {

onStart { showLoading() }

request { repository.login(account, password) }

onSuccess { loginData.value = it }

}

}

}

需创建 LoginViewModel类,继承BaseViewModel,并传入 LoginRepository,自动注入 LoginRepositoy 实例。

quickLaunch 方法是使用 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

}

// ServiceFactory.kt

object ServiceFactory {

// 初始化 ApiService

val apiService by lazy { RetrofitFactory.create(ApiService::class.java) }

}

// LoginRepository.kt

class LoginRepository {

suspend fun login(account: String, password: String): BaseResponse {

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 一起交流学习。

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

示例项目

其他相关

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29011239/article/details/117739160

智能推荐

SpringCloud链路追踪SkyWalking-第一章-介绍_芋道 spring cloud 链路追踪 skywalking 入门-程序员宅基地

文章浏览阅读330次。Skywalking 是一个优秀的APM(application performance monitor)应用性能监控系统,针对微服务场景设计,可以方便的实现Spring cloud等微服务场景下的性能监控、链路追踪等。而v8.x版本也支持了日志收集功能,可以取代ELK作为分布式下日志收集的方案。一个系统实现 监控+追踪+日志 的多个能力,有效降低微服务下运维的复杂度。..._芋道 spring cloud 链路追踪 skywalking 入门

Vue项目中用js实现列表上移、下移、置顶、置尾以及复制功能_搜索置顶 vue js-程序员宅基地

文章浏览阅读1.8k次,点赞4次,收藏9次。复制功能_搜索置顶 vue js

WM8960音频播放-程序员宅基地

文章浏览阅读2k次。第一节 音频播放原理首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=20515&page=1#175657 S5PV210通过i2s和i2c与音频编解码芯片wm8960进行交互,其中i2s负责只传输声音数据,而i2c负责传输控制信息(如音量调节、静音等),w..._wm8960视频

fanuc机器人防干涉区域功能_fanuc机器人干涉区space-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏17次。防干涉区域功能是这样一种功能,即在其它机器人或其它外围设备位于预先设定的干涉区域时,即便向机器人发出进入干涉区域的移动指令,机器人也会自动停止,并在确认其它外围设备等已经从干涉区域移走后,解除停止状态而重新开始操作。_fanuc机器人干涉区space

CSS在移动端隐藏滚动条/自定义滚动条(scrollbar的各种属性)_移动端页面不能滚动时不要出现滚动条-程序员宅基地

文章浏览阅读3.8w次,点赞6次,收藏18次。一个丑丑的滚动条在某些时候是非常碍眼的,移动端由于屏幕小的缘故,更是显眼,最好还是让它能不出现,就不出现。除了用div遮罩外,许多浏览器内核也提供了私有属性控制滚动条的样式。移动端多为weibkit内核,滚动条的定制方案提供的很完善,蛮强大的哦~最基本的,overflow属性先设置好auto或者scroll,而不是hidden,毕竟我们仅仅是隐藏了滚动条,而不是让它整个都不能滚了滚动条的涵义:scrollbar_移动端页面不能滚动时不要出现滚动条

web应用之EBJ配置与扩展映射-程序员宅基地

文章浏览阅读91次。<!-- 配置EJB本地bean的引用 --> <!-- 其中ref-type定义bean类型(一种是实体bean,一种是会话bean),local-home和local必须为完全限定名 --> <ejb-local-ref> <ejb-ref-name>ebj/Customer</ejb-ref-name> ..._ebjwew

随便推点

数据结构---单链表实现线性表_单链表构建线性表-程序员宅基地

文章浏览阅读767次。动态链表就是链式存储结构具体实现的核心思想 linkedSinglyList就是线性结构链式存储方式的具体实现,称为单链表_单链表构建线性表

扩展VLAN特性与管理——2_两层vlan标签-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏8次。QinQ基础前面介绍的VLAN都是单层标签的,也就是在数据帧中只有一个802.1Q标签头,QinQ(是802.1Q-in-802.1Q的简称)技术是一项可在数据帧中的原802.1Q标签头基础上再增加一层802.1Q标签头,实现双VLAN标签的目的。要注意,启用了QinQ功能的交换机端口具有添加和剥离外层VLAN标签的双重功能,即上行传输时对帧添加外层标签,而下行传输时又可以剥离帧中的外层标签,_两层vlan标签

以太网网口信号测试软件,以太网网口流量测试,吞吐量测试-程序员宅基地

文章浏览阅读2k次。以太网网口流量测试,吞吐量测试现在有很多硬件平台理论上支持千兆以太网接口,但实际传输速率远远低于千兆,并且丢包率很高。近我做了一些以太网吞吐量和丢包率方面的优化工作,有一些心得和大家分享一下。二、影响吞吐量和丢包率的因素1. 网卡DMA缓冲区大小这个缓冲区决定tx ring buffer和rx ring buffer的大小,如果ringbuffer太小,那么网卡缓存数据包的能力有限,当接收数据能力..._网口数据流量测试

垃圾收集器与内存分配策略——垃圾收集算法与HotSpot虚拟机算法实现_hotspot 虚拟机 垃圾收集器与内存分配策略-程序员宅基地

文章浏览阅读126次。垃圾收集算法的具体实现涉及大量的程序细节,这里只描述其算法的基本思想和发展过程一、常见的垃圾收集算法对比如下收集算法 具体实现 优点 不足 标记-清除算法 1、首先标记出所有需要回收的对象 2、标记完成之后,统一回收所有被标记的对象 效率低:标记和清除两个过程效率都不高 空间问题:标记清除之后又大量的碎片,..._hotspot 虚拟机 垃圾收集器与内存分配策略

phpmyadmin #1045 MySQL 服务器的解决方案_phpmyadmin 1045-程序员宅基地

文章浏览阅读1k次。无论是LAMP安装包还是XAMP, 以及自定义安装了这个LAMP环境, 基本上都会使用PHPMYADMIN来管理MYSQL数据库, 对于一般的LAMP或者XAMP安装包, 一般都有配置说明, 里面包括了一些最基本的说明, 如MYSQL的用户名(一般是root)和密码(123456), 然后再把PHPMYADMIN在装MYSQL并列的文件夹即可连接. 连接的帐号和密码是MYSQL的用户名和密码, 这..._phpmyadmin 1045

connect()函数_connect函数-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏22次。connect()用于建立与指定socket的连接。头文件: #include <sys/socket.h>函数原型: int connect(SOCKET s, const struct sockaddr * name, int namelen);参数:s:标识一个未连接socketname:指向要连接套接字的sockaddr结构体的指针namelen:sockaddr结构体的字节长度connect() 函数用来建立连接,它的原型为[1]: 1..._connect函数

推荐文章

热门文章

相关标签