EasyMvp使用手册

Mvp快速开发框架

本框架采用mvp架构,整合koin,retrofit,协程,lifecycle等主流库,并结合EasyMvpTemplate一键生成需要的view,presenter,model以及依赖注入相关代码

术语解释:
1.koin 是一个用于 Kotlin的实用型轻量级依赖注入框架,采用纯 Kotlin 编写而成,仅使用功能解析,无代理、无代码生成、无反射
2.retrofit 一款非常流行的网络请求框架
3.协程 一种计算机编程语言概念,kotlin协程的作用可以简单理解为像写同步代码一样编写异步操作
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)
        }
        //启动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" />

项目使用kotlin,目前需要强制指定kotlin版本,不指定的话koin会报错
在gradle的依赖里面

configurations.all {
        resolutionStrategy {
            force 'org.jetbrains.kotlin:kotlin-stdlib:1.3.72' // 强制指定使用某个版本
        }
    }

详见 https://github.com/yuan9034/EasyMvp/blob/master/app/src/main/AndroidManifest.xml

目前框架支持的配置有
1.联网的baseurl
2.自定义应用缓存目录
3.自定义缓存策略(内置lrucache策略以及IntelligentCache策略)
4.自定义打印(网络打印内容以及格式)
5.自定义图片加载策略(内置Glide加载)
6.自定义GlobalHttpHandler(处理Http请求和响应结果的处理类)
7.自定义gson配置
8.自定义Retrofit配置
9.自定义OKHttp配置

详见https://github.com/yuan9034/EasyMvp/blob/master/app/src/main/java/com/xdja/app/config/GlobalConfiguration.kt

mvp代码一键生成

1.下载EasyMvpTemplate 地址: https://github.com/yuan9034/EasyMvpTemplate
2.复制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 全家桶 即可创建对应的mvp相关代码

如图
1595039358(1).png

按照下图提示,进项相应的输入


1595039358(1).png
注意 最下方勾选语言仅支持kotlin
4.将生成的koin注入的module加入到application的初始化代码中

生成的代码在项目包名-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加入,可以用+号添加多个
            modules(TestModule)
        }
        loadKoinModules(EasyMvpModule.theLibModule)
        super.onCreate()
    }
}

将TestModule
注意:由于该架构采用纯kotlin开发,而且采用了java不具备的协程功能,故该模板只能生成kotlin代码

model里面io操作建议以下两种方式

    #方式一 利用flow函数发射数据源 类似rxjava
    fun getTest1(): Flow<TestBean> = flow {
        emit(mRepositoryManager!!.obtainRetrofitService(ServerApi::class.java)
            .getServer("https://wanandroid.com/wxarticle/chapters/json", 2))
    }
    #方式二 利用suspend函数里面的withContext切换线程并返回
    suspend fun getTest(): TestBean {
        return withContext(Dispatchers.IO){
            mRepositoryManager!!.obtainRetrofitService(ServerApi::class.java)
                .getServer("https://wanandroid.com/wxarticle/chapters/json", 2)
        }
    }

相对应的presenter里面协程使用方式

示例代码如下:

    # 针对model方式一的调用,类似rxjava,框架自动解绑订阅
    fun getTest1() {
        launch {
            mModel!!.getTest1()
                .flowOn(Dispatchers.IO)
                .collect {
                    mRootView!!.showBean(it)
                }
        }
    }
    # 针对model方式二的调用,框架自动解绑订阅
    fun getTest() {
        launch {
            delay(2000)
            val bean = mModel!!.getTest()
            mRootView!!.showBean(bean)
        }
    }

launch函数本身运行在主线程
basepresenter封装了mainScope,finallyBlock(协程体执行结束回调),failBlock(协程体抛出异常回调)

EventBus使用指南

框架内使用EventBusManager管理EventBus,用户自己决定使用AndroidEventbus还是Eventbus,取决于用户依赖"org.simple:androideventbus:1.0.5.1"还是依赖"org.greenrobot:eventbus:3.2.0"。可同时使用。
BaseActivity,BaseFragment里面的useEventbus默认返回true,无需再次注册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容