Android 架构

Android MVP架构与模块化Kotlin实现

2019-02-08  本文已影响0人  眺望天空

本篇博客原计划于一周前写完,因为过年偷懒了,今天补上。大家有什么疑问欢迎留言。

内容分为三部分,模块化,MVP,用注册功能代码实现。

第一部分模块化

简单讲解什么是模块化

为什么模块化

模块化图形示例

模块化.png

如何实现模块化

模块之间通讯

第二部分MVP架构

讲在最前,MVC,MVP,MVVM,都是一种思想,也不是一成不变的,没有好坏之分,根据项目不同,规模不同,选择适合自己项目的架构才是最好的选择。

MVP概念

mvp.jpg

MVP Google官方版介绍

MVP 优化版介绍

第三部分 以注册功能实现MVP架构与模块化

首先看一下已经建好的项目结构
项目结构.jpg

当主工程依赖其他模块(比如模块1),但是模块1又需要单独开发调试时,可以动态对模块1进行设置,根据不同的设置,模块1可以分别以模块1运行,也可以以主工程的方式运行。

#true表示是库工程,false表示主工程
isUserModule=false
if(isUserModule.toBoolean()){
    apply plugin: 'com.android.library'
}else{
    apply plugin: 'com.android.application'
}

动态加载AndroidManifest.xml文件,将sourceSets
部分放在android{}的最后就可以。文字不太清楚直接看下面代码。

#build.gradle 文件

if(isUserModule.toBoolean()){
    apply plugin: 'com.android.library'
}else{
    apply plugin: 'com.android.application'
}

...

android {
    ...
    sourceSets {
        main {
            if (isUserModule.toBoolean()) {
                manifest.srcFile 'src/main/release/AndroidManifest.xml'
                //release 模式下排除debug文件夹下的所有java文件
                java {
                    exclude 'debug/**'
                }
            } else {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            }
        }
    }

}

dependencies {
    ...
}

sourceSets部分实现动态加载AndroidManifest.xml文件。

注册功能mvp结构图

mvp.png

MVP架构的实现

BaseActiviy

package com.gobagou.base.ui.activity

import android.support.v7.app.AppCompatActivity

/**
 * Author: Created by XHJ on 2019/2/9.
 * 种一棵树最好的时间是十年前,其次是现在。
 */
open class BaseActivity : AppCompatActivity(){
}

BaseMvpActivity

package com.gobagou.base.ui.activity

import com.gobagou.base.presenter.BasePresenter
import com.gobagou.base.presenter.view.BaseView

/**
 * Author: Created by XHJ on 2019/2/9.
 * 种一棵树最好的时间是十年前,其次是现在。
 */
open class BaseMvpActivity<T:BasePresenter<*>>:BaseActivity(), BaseView{

    lateinit var mPresenter: T

    override fun showLoading() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun hideLoading() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onError() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}

BasePresenter

package com.gobagou.base.presenter

import com.gobagou.base.presenter.view.BaseView

/**
 * Author: Created by XHJ on 2019/2/9.
 * 种一棵树最好的时间是十年前,其次是现在。
 */
open class BasePresenter<T:BaseView> {
    lateinit var mView: T
}

BaseView

package com.gobagou.base.presenter.view

/**
 * Author: Created by XHJ on 2019/2/9.
 * 种一棵树最好的时间是十年前,其次是现在。
 */
interface BaseView {
    fun showLoading()
    fun hideLoading()
    fun onError()
}

RegisterActivity

这个地方你可能会有疑问,做了这么多准备,为什么还要自己创建变量???

对,这么写其实是不科学的,后期做项目的时候,mPresenter,mPresenter.mView的实例化是不需要手动创建的,是采用dagger2来实现。dagger2像Rxjava2一样的神器。

package com.gobagou.user.ui.activity

import android.os.Bundle
import com.gobagou.base.ui.activity.BaseMvpActivity
import com.gobagou.user.R
import com.gobagou.user.presenter.RegisterPresenter
import com.gobagou.user.presenter.view.RegisterView
import kotlinx.android.synthetic.main.activity_register.*
import org.jetbrains.anko.toast

class RegisterActivity : BaseMvpActivity<RegisterPresenter>(), RegisterView {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        mPresenter = RegisterPresenter()
        mPresenter.mView = this

        mRegisterBtn.setOnClickListener {
            mPresenter.register("18910229999","123456")
        }
    }

    override fun onRegisterResult(result: String) {
        toast(result)
    }
}

RegisterPresenter

在“业务逻辑”部分就是去请求网络等操作

package com.gobagou.user.presenter

import com.gobagou.base.presenter.BasePresenter
import com.gobagou.user.presenter.view.RegisterView

/**
 * Author: Created by XHJ on 2019/2/9.
 * 种一棵树最好的时间是十年前,其次是现在。
 */
class RegisterPresenter: BasePresenter<RegisterView>() {
    fun register(mobile:String, pwd:String){
        /*
        业务逻辑
         */
        mView.onRegisterResult("注册成功")
    }
}

RegisterView
回调视图,处理presenter放回的结果

package com.gobagou.user.presenter.view

import com.gobagou.base.presenter.view.BaseView

/**
 * Author: Created by XHJ on 2019/2/9.
 * 种一棵树最好的时间是十年前,其次是现在。
 */
interface RegisterView: BaseView {
    fun onRegisterResult(result:String)
}

到这里,模块化与MVP架构就已经实现了。有兴趣的小伙伴也动手试一下吧。
Gitbub地址,如果对你有所帮助,给点个星,感谢。
Github地址:https://github.com/xiaohuangya123/MVPDemo

上一篇下一篇

猜你喜欢

热点阅读