Mvp快速開發(fā)框架
本框架采用mvp架構(gòu)鼻听,整合koin,retrofit,協(xié)程,lifecycle等主流庫联四,并結(jié)合EasyMvpTemplate一鍵生成需要的view,presenter,model以及依賴注入相關(guān)代碼
術(shù)語解釋:
1.koin 是一個(gè)用于 Kotlin的實(shí)用型輕量級(jí)依賴注入框架朝墩,采用純 Kotlin 編寫而成,僅使用功能解析收苏,無代理鹿霸、無代碼生成、無反射
2.retrofit 一款非常流行的網(wǎng)絡(luò)請求框架
3.協(xié)程 一種計(jì)算機(jī)編程語言概念,kotlin協(xié)程的作用可以簡單理解為像寫同步代碼一樣編寫異步操作
4.lifecycle Android官方api,本框架用來跟view的生命周期綁定取消異步操作
使用步驟
1.添加依賴,依賴方式如下:
implementation 'com.yuanwanli:easymvp:0.0.3'
2.自定義Application繼承BaseApplication
import com.xdja.easymvp.base.BaseApplication
import com.xdja.easymvp.di.EasyMvpModule
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidFileProperties
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
import org.koin.core.logger.Level
class MyApp : BaseApplication() {
override fun onCreate() {
startKoin {
//logger
androidLogger(Level.DEBUG)
//android context
androidContext(this@MyApp)
}
//啟動(dòng)startKoin 后 可以使用
loadKoinModules(EasyMvpModule.theLibModule)
super.onCreate()
}
}
AndroidManifest指定application
<application
android:name=".MyApp"
3.AndroidManifest 配置框架自定義屬性
<meta-data
android:name="com.xdja.app.config.GlobalConfiguration"
android:value="ConfigModule" />
項(xiàng)目使用kotlin,目前需要強(qiáng)制指定kotlin版本,不指定的話koin會(huì)報(bào)錯(cuò)
在gradle的依賴?yán)锩?/p>
configurations.all {
resolutionStrategy {
force 'org.jetbrains.kotlin:kotlin-stdlib:1.3.72' // 強(qiáng)制指定使用某個(gè)版本
}
}
詳見 https://github.com/yuan9034/EasyMvp/blob/master/app/src/main/AndroidManifest.xml
目前框架支持的配置有
1.聯(lián)網(wǎng)的baseurl
2.自定義應(yīng)用緩存目錄
3.自定義緩存策略(內(nèi)置lrucache策略以及IntelligentCache策略)
4.自定義打右傺摺(網(wǎng)絡(luò)打印內(nèi)容以及格式)
5.自定義圖片加載策略(內(nèi)置Glide加載)
6.自定義GlobalHttpHandler(處理Http請求和響應(yīng)結(jié)果的處理類)
7.自定義gson配置
8.自定義Retrofit配置
9.自定義OKHttp配置
mvp代碼一鍵生成
1.下載EasyMvpTemplate 地址: https://github.com/yuan9034/EasyMvpTemplate
2.復(fù)制EasyMvpTemplate文件夾到你自己的AndroidStudio安裝目錄里面的Activity模板目錄扯键,重啟AndroidStudio
Windows : AS安裝目錄/plugins/android/lib/templates/activities
Mac : /Applications/AndroidStudio.app/Contents/plugins/android/lib/templates/activities
3.AndroidStudio里面 new->Activity->EasyMvp 全家桶 即可創(chuàng)建對應(yīng)的mvp相關(guān)代碼
如圖按照下圖提示珊肃,進(jìn)項(xiàng)相應(yīng)的輸入
注意 最下方勾選語言僅支持kotlin
4.將生成的koin注入的module加入到application的初始化代碼中
生成的代碼在項(xiàng)目包名-di-XXXModule.kt里面(XXX為上步驟你輸入koin注入的module名稱)
比如我的demo里面的生成的TestModule,生成代碼之后加入到application的初始化代碼中
val TestModule = module {
scope<TestActivity> {
scoped<TestContract.Model> { TestModel(get()) }
scoped {
TestPresenter(get(), this.getSource())
}
}
}
class MyApp : BaseApplication() {
override fun onCreate() {
startKoin {
androidLogger(Level.DEBUG)
androidContext(this@MyApp)
//此處將koin生成的module加入伦乔,可以用+號(hào)添加多個(gè)
modules(TestModule)
}
loadKoinModules(EasyMvpModule.theLibModule)
super.onCreate()
}
}
將TestModule
注意:由于該架構(gòu)采用純kotlin開發(fā),而且采用了java不具備的協(xié)程功能烈和,故該模板只能生成kotlin代碼
model里面io操作建議以下兩種方式
#方式一 利用flow函數(shù)發(fā)射數(shù)據(jù)源 類似rxjava
fun getTest1(): Flow<TestBean> = flow {
emit(mRepositoryManager!!.obtainRetrofitService(ServerApi::class.java)
.getServer("https://wanandroid.com/wxarticle/chapters/json", 2))
}
#方式二 利用suspend函數(shù)里面的withContext切換線程并返回
suspend fun getTest(): TestBean {
return withContext(Dispatchers.IO){
mRepositoryManager!!.obtainRetrofitService(ServerApi::class.java)
.getServer("https://wanandroid.com/wxarticle/chapters/json", 2)
}
}
相對應(yīng)的presenter里面協(xié)程使用方式
示例代碼如下:
# 針對model方式一的調(diào)用斥杜,類似rxjava沥匈,框架自動(dòng)解綁訂閱
fun getTest1() {
launch {
mModel!!.getTest1()
.flowOn(Dispatchers.IO)
.collect {
mRootView!!.showBean(it)
}
}
}
# 針對model方式二的調(diào)用,框架自動(dòng)解綁訂閱
fun getTest() {
launch {
delay(2000)
val bean = mModel!!.getTest()
mRootView!!.showBean(bean)
}
}
launch函數(shù)本身運(yùn)行在主線程
basepresenter封裝了mainScope缰儿,finallyBlock(協(xié)程體執(zhí)行結(jié)束回調(diào))散址,failBlock(協(xié)程體拋出異常回調(diào))
EventBus使用指南
框架內(nèi)使用EventBusManager管理EventBus,用戶自己決定使用AndroidEventbus還是Eventbus,取決于用戶依賴"org.simple:androideventbus:1.0.5.1"還是依賴"org.greenrobot:eventbus:3.2.0"瞪浸±艋觯可同時(shí)使用。
BaseActivity,BaseFragment里面的useEventbus默認(rèn)返回true,無需再次注冊