学习了Kotlin有一段时间了, 每次写项目/Demo
的时候, 老是用到网络请求
、MVP
、MVVM
、经常使用工具类
、通用自定义View
, 索性把这些整合到一块儿, 搭成一个Android的脚手架——KtArmor
.java
KtArmor
寓意着 为Android 赋予战斗装甲
, 方便开发者快速进行Android 开发。节约开发者开发时间。为了知足开发者需求, 我整合了两个分支, 分别对应着 MVP
, MVVM
.git
MVP
+ Kotlin
Retrofit
+ Okhttp
+ Coroutine
+ RxJava
BaseActivity
、BaseFragment
、ToolbarActivity
封装MvpActivity
、MvpFragment
、BasePresenter
、BaseModel
封装BaseOkHttpClient
、BaseRetrofit
、RetrofitFactory
PlaceHolderView(占位布局)
, LoadingView(加载框)
SharedPreferences
、StartActivity
、Log
、Toast
(不重复显示))等Activity
、Presenter
、Contract
、Model
)生成插件MVVM
+ Androidx
+ Kotlin
+ LiveData
+ ViewModel
Coroutines
+ Retrofit
+ Okhttp
先在 build.gradle(Project:XXXX) 的 repositories 添加:github
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
复制代码
而后在 build.gradle(Module:app) 的 dependencies 添加:api
implementation 'com.github.hyzhan43:KtArmor:mvp-1.0.4' // 根据github 引入最新版本便可
复制代码
在Application 中初始化KtArmor
框架。新建一个application 类, 如 BaseApplication, 在 BaseApplication 中, 调用KtArmor的 init
方法, 进行初始化, 参数以下:bash
application
,RetrofitConfig
配置。class BaseApplication: Application(){
override fun onCreate() {
super.onCreate()
// 初始化KtArmor
KtArmor.init(this, MyRetrofitConfig())
}
}
复制代码
再新建一个 RetrofitConfig 配置类, 继承 BaseRetrofitConfig
. 并复写 baseUrl
属性, 添加本身的 baseUrl。网络
class MyRetrofitConfig : BaseRetrofitConfig() {
override val baseUrl: String
get() = API.BASE_URL
}
复制代码
这样你就建立好了一个拥有Kotlin
+ Retrofit
+ Okhttp
+ Coroutine
项目了。而后就能够愉快编写本身的业务代码了(●'◡'●)架构
咱们先从简单登陆流程来熟悉一下KtArmor。首先编写 LoginContract, 代码以下:app
interface LoginContract {
interface View : BaseContract.View {
fun accountEmpty(msg: Int)
fun passwordEmpty(msg: Int)
fun loginSuc(loginRsp: LoginRsp)
}
interface Presenter : BaseContract.Presenter {
fun login(account: String, password: String)
}
}
复制代码
而后新建一个LoginActivity, 继承 MvpActivity
并传递对应 LoginContract.Presenter
泛型,实现 LoginContract.View
接口, 代码以下:框架
class LoginActivity : MvpActivity<LoginContract.Presenter>(), LoginContract.View {
override fun getLayoutId(): Int = R.layout.activity_login
override fun bindPresenter(): LoginContract.Presenter = LoginPresenter(this)
override fun initListener() {
super.initListener()
mBtnLogin.setOnClickListener {
mTilAccount.isErrorEnabled = false
mTilPassword.isErrorEnabled = false
// 发起登陆请求
presenter.login(mEtAccount.str(), mEtPassword.str())
}
}
override fun accountEmpty(msg: Int) {
mTilAccount.isErrorEnabled = true
mTilAccount.requestFocus()
mTilAccount.error = getString(msg)
}
override fun passwordEmpty(msg: Int) {
mTilPassword.isErrorEnabled = true
mTilPassword.requestFocus()
mTilPassword.error = getString(msg)
}
override fun loginSuc(loginRsp: LoginRsp) {
toast("登录成功!")
}
}
复制代码
这里 activity_login 里面是简单的 TextInputEditText,调用presenter, 发起登陆请求。传递帐号和密码。其中 str() 为 TextView 扩展方法。maven
str()
为扩展方法// 获取text内容
fun TextView.str(): String {
return this.text.toString()
}
复制代码
而后咱们再看看对应 LoginPresenter 实现, 继承 BasePresenter
,并传递对应 LoginContract.View
class LoginPresenter(view: LoginContract.View) : BasePresenter<LoginContract.View>(view), LoginContract.Presenter {
override fun login(account: String, password: String) {
if (account.isEmpty()) {
view?.accountEmpty(R.string.account_empty)
return
}
if (password.isEmpty()) {
view?.passwordEmpty(R.string.password_empty)
return
}
launchUI({
view?.showLoading()
val response = LoginModel.login(account, password)
// 正常返回结果处理
if (response.isSuccess()) {
response.data?.let { view?.loginSuc(it) }
} else {
view?.showError(response.errorMsg)
}
}, {
// TODO 异常处理
})
}
}
复制代码
在这里, 咱们采用协程
来实现切换线程操做。在 launchUI() 方法里面启动了一个 UI 协程,在这里调用 LoginModel 真正发起网络请求操做。
object LoginModel : BaseModel() {
suspend fun login(account: String, password: String): BaseResponse<LoginRsp> {
return launchIO { ApiManager.apiService.loginAsync(account, password).await() }
}
}
复制代码
一样,LoginModel 须要继承 BaseModel()
,并调用 launchIO 进行线程切换。切换到 IO线程 经过ApiManager.apiService 发起网络请求。而后调用 await() 返回结果。这里 ApiService 经过 RetrofitFactory建立, 传入 Service class。
object ApiManager {
val apiService by lazy {
RetrofitFactory.instance.create(ApiService::class.java)
}
}
复制代码
interface ApiService {
@POST(API.LOGIN)
fun loginAsync(@Query("username") username: String, @Query("password") password: String): Deferred<BaseResponse<LoginRsp>>
}
复制代码
以上就是登陆的全过程。看到这里,编写一个简单Login
功能须要新建四个类,有点麻烦。有没有更便捷的方法的。那确定!KtArmor
框架还有与之对应 KtArmor-MVP
插件,帮助开发者快速生成对应模板代码(Activity
、Presenter
、Contract
、Model
)。
这是KtArmor开篇的第一篇。大概讲解了KtArmor基本用法。后续会详细讲解框架的使用、以及插件的使用。至于KtArmor-MVVM
版目前还在测试阶段。后续也会陆续更新。敬请期待吧!
着急的小伙伴能够直接查看下文源码
~
KtArmor
框架是一款小而美的框架,也是我我的经验的积累, 总结。若有不妥, 望各位大佬指出。欢迎你们 pr交易
, 一块儿交流学习。
下次再见