Kotlin Android MVP設(shè)計模式及基類的實現(xiàn)

前言

之前寫過一篇文章說的是如何用java實現(xiàn)mvp模式
Android MVP模式 簡單入門實踐
現(xiàn)在不是用的Kotlin比較多嘛,所以來做下用kotlin實現(xiàn)MVP模式的筆記
而且之前的也只是簡單應(yīng)用母谎,實際開發(fā)它是存在著設(shè)計問題的,如重復(fù)代碼渤闷、內(nèi)存泄漏

正文

這次的mvp實現(xiàn)和之前用java實現(xiàn)的一模一樣
所以一些解釋就不在這里重復(fù)了
View+Contract+Presenter


MVPContract

interface MVPContract {

    interface View{
        fun onDataLoad(str: String)
    }

    interface Presenter{
        fun dataLoad()
    }
}

MVPPresenter

class MVPPresenter constructor(var mView: MVPContract.View) : MVPContract.Presenter{

    override fun dataLoad() {
        val str = "假裝自己是從服務(wù)器獲取到的數(shù)據(jù)"
        Thread(Runnable {
            try {
                Thread.sleep(2000)
            } catch (e: InterruptedException) {
                e.printStackTrace()
            }
        }).start()
        mView.onDataLoad(str)
    }

}

MVPActivity

class MVPActivity : AppCompatActivity(), MVPContract.View {

    private var mPresenter: MVPPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_mvp)
        mPresenter = MVPPresenter(this)
        textView.setOnClickListener{ mPresenter!!.dataLoad()}
    }

    override fun onDataLoad(str: String) {
        textView.text = str
    }
}

存在問題

我們不難發(fā)現(xiàn)這樣實現(xiàn)的MVP需要重復(fù)聲明mPresenter喻频、mView
而且mPresenter是一直持有對mView的引用的(在oncreat里面綁定卻沒有解綁)

解決方案

所以我們需要寫一個baseActivity托酸、basePresenter來避免重復(fù)聲明mPresenter和mView
為了避免mPresenter導(dǎo)致的內(nèi)存泄漏
還需要attachView()來獲取view的實例在onCreat()里
和detachView()來釋放view對象的引用讓GC回收內(nèi)存

BaseContract

attachView()和detachView()是重復(fù)的業(yè)務(wù)邏輯,所以將其放到這里

interface BaseContract {

    interface BaseView{

    }

    interface BasePresenter<in T>{
        fun attachView(view: T)
        fun detachView()
    }

}

BasePresenter

在kotlin里需要用open關(guān)鍵字聲明該類是可繼承的

open class BasePresenter<T : BaseContract.BaseView> : BaseContract.BasePresenter<T> {

    protected var mView: T? = null

    override fun attachView(view: T) {
        this.mView = view
    }

    override fun detachView() {
        this.mView = null
    }
}

BaseActivity

getLayoutId() 視圖綁定
initPresenter() 初始presenter
configView() 相關(guān)view的事件

abstract class BaseActivity <in V: BaseContract.BaseView,P :BaseContract.BasePresenter<V>> : AppCompatActivity(){

    protected var mPresenter: P? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mPresenter = initPresenter()
        mPresenter!!.attachView(this as V)
        setContentView(getLayoutId())
        configView()
    }

    override fun onDestroy() {
        super.onDestroy()
        mPresenter!!.detachView()
    }

    protected abstract fun getLayoutId(): Int
    protected abstract fun initPresenter(): P
    protected abstract fun configView()
}

MainContract

需要注意的是Presenter綁定的view為該契約類生聲明的view

interface MainContract {

    interface View: BaseContract.BaseView{
        fun onLoadData(str: String)
    }

    interface Presenter : BaseContract.BasePresenter<View>{
        fun loadData()
    }
}

MainPresenter

class MainPresenter : BasePresenter<MainContract.View>(),MainContract.Presenter{

    override fun loadData() {
        val str = "假裝自己是從服務(wù)器獲取到的數(shù)據(jù)"
        Thread(Runnable {
            try {
                Thread.sleep(2000)
            } catch (e: InterruptedException) {
                e.printStackTrace()
            }
        }).start()
        mView!!.onLoadData(str)
    }

}

MainActivity

class MainActivity : BaseActivity<MainContract.View,MainContract.Presenter>(),MainContract.View {


    override fun getLayoutId(): Int = R.layout.activity_main

    override fun initPresenter(): MainContract.Presenter = MainPresenter()

    override fun configView() {
        text.setOnClickListener{ mPresenter!!.loadData() }
    }

    override fun onLoadData(str: String) {
        text.text = str
    }
}

結(jié)語

以上就是用kotlin實現(xiàn)的mvp模式及基類的簡單封裝不跟,謝謝觀看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颓帝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窝革,更是在濱河造成了極大的恐慌购城,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虐译,死亡現(xiàn)場離奇詭異瘪板,居然都是意外死亡,警方通過查閱死者的電腦和手機漆诽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門侮攀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锣枝,“玉大人,你說我怎么就攤上這事兰英∑踩” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵畦贸,是天一觀的道長陨闹。 經(jīng)常有香客問我,道長薄坏,這世上最難降的妖魔是什么趋厉? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮胶坠,結(jié)果婚禮上君账,老公的妹妹穿的比我還像新娘。我一直安慰自己沈善,他們只是感情好杈绸,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矮瘟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塑娇。 梳的紋絲不亂的頭發(fā)上澈侠,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音埋酬,去河邊找鬼哨啃。 笑死,一個胖子當(dāng)著我的面吹牛写妥,可吹牛的內(nèi)容都是我干的拳球。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼珍特,長吁一口氣:“原來是場噩夢啊……” “哼祝峻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起扎筒,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤莱找,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗜桌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奥溺,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年骨宠,在試婚紗的時候發(fā)現(xiàn)自己被綠了浮定。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片相满。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桦卒,靈堂內(nèi)的尸體忽然破棺而出立美,到底是詐尸還是另有隱情,我是刑警寧澤闸盔,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布悯辙,位于F島的核電站,受9級特大地震影響迎吵,放射性物質(zhì)發(fā)生泄漏躲撰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一击费、第九天 我趴在偏房一處隱蔽的房頂上張望拢蛋。 院中可真熱鬧,春花似錦蔫巩、人聲如沸谆棱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃瞧。三九已至,卻和暖如春坪郭,著一層夾襖步出監(jiān)牢的瞬間个从,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工歪沃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗦锐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓沪曙,卻偏偏與公主長得像奕污,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子液走,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容