天天看點

Android中使用Kotlin搭建MVP前言kotlinMvp目錄結構Base基類結語

前言

從來不寫部落格的我(其實之前大學有寫過),突然也想記錄一下生活(zhuang bi),于是有了這篇開篇部落格��。如果覺得對你有幫助,請多多支援。雖然kotlin出來有一段時間了,我也是剛正式将kotlin作為Android開發第一語言使用,是以有什麼不規範的地方希望各位大佬們能指出。本篇教程适用于有點基礎的小白。

kotlin

什麼是kotlin?kotlin簡而言之就是一門基于jvm的程式設計語言和java相容,但是比java更強大,而且大大減少你的代碼,提高開發效率。

Mvp

mvp開發模式已經不是什麼新鮮的技術,或者說它也不能說是一門技術。我的了解它就是讓代碼更加規範的一種程式設計風格。便于管理和開發,最主要的作用還是用于解耦。由于本篇是教大家如何用Kotlin快速搭建一個Android項目,是以對于一些mvp的概念和kotlin的使用不會做詳細的介紹。

目錄結構

Android中使用Kotlin搭建MVP前言kotlinMvp目錄結構Base基類結語

以上是我的分包,這是一個Demo,實際項目還是得按具體情況具體分析。

Base基類

BaseModle

interface BaseModle {
    //TODO:modle裡相關操作
}
           

BaseView

BaseView
interface BaseView{
    //TODO:view裡相關操作
}
           

BasePresenter

abstract class BasePresenter<V : BaseView> {
    var view: WeakReference<V>? = null

    fun bindView(view: V) {
        this.view = WeakReference(view)
    }

    fun isBind(): Boolean {
        return view != null && view!!.get() != null
    }

    fun unBindView() {
        if (isBind()) {
            view!!.clear()
            view = null
        }
    }

    fun obtainView(): V? {
        return if (isBind()) view!!.get() else null
    }
}
           

其實和Java抽取mvp基類大同小異,具體問題具體分析,在接口中根據實際情況定義方法。

上面實作了modle,view,presenter的基類,我們在使用時隻需繼承即可。

Example:

MainContract

interface MainContract {
    interface IView : BaseView {
        //TODO:...
    }

    interface IModle : BaseModle {
        //TODO:...
    }

    abstract class IPresenter : BasePresenter<IView>() {
        //TODO:...
    }
}
           

MainModle

class MainModle : MainContract.IModle {
     //TODO:...
}
           

MainPresenter

class MainPresenter : MainContract.IPresenter() {
    init {
        var modle: MainContract.IModle = MainModle()
        var view: MainContract.IView = obtainView()!!
    }
}
           

接下來就是Activity的抽取,這個隻是一個示例,具體情況還需具體分析

BaseActivity

abstract class BaseActivity<V : BaseView, P : BasePresenter<V>> : AppCompatActivity() {
    var presenter: P? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getResLayoutId())
        presenter = initPresenter()
        presenter!!.bindView(this as V)
        initView()
        initAction()
        doMoreThings()
    }

    /**其他操作**/
    abstract fun doMoreThings()

    /**擷取布局資源**/
    abstract fun getResLayoutId(): Int

    /**擷取控件**/
    abstract fun initView()

    /**設定監聽**/
    abstract fun initAction()

    /**初始化presenter**/
    abstract fun initPresenter(): P

    /**可觸摸時執行的操作**/
    abstract fun doOnResume()

    override fun onResume() {
        super.onResume()
        doOnResume()
    }

    override fun onDestroy() {
        super.onDestroy()
        presenter!!.unBindView()
    }
}
           

使用時隻需繼承即可

class MainActivity : BaseActivity<MainContract.IView, MainPresenter>(), MainContract.IView {
    override fun doMoreThings() {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

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

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

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

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

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

}
           

上面給出了Activity的一種抽取方式,Fragment大同小異,就不給出了。

結語

至此使用Kotlin搭建一個簡單的mvp就已經完成了,其他業務邏輯根據實際情況向接口中添加。本人也剛加入kotlin開發,至此還有很多細節沒有注意,歡迎大家吐槽