使用kotlin實現MVP的方式(簡單好用)
kotlin怎麼好用就不多說了,總之我用了感覺非常舒服,今天說一下用kotlin搭建一個MVP框架。
先定義抽象類IPresenter,IPresenter持有軟引用定義的mView,防止記憶體洩漏,mView型別必須是實現了IView介面的例項,然後定義生命週期方法,open並且不是抽象方法,讓子類有選擇的去實現生命週期。
package com.khaless.demo.mvp import android.content.Intent import android.os.Bundle import java.lang.ref.SoftReference /** * Author: Li Hai Kun * Description: * Date: 2017/3/22 */ abstract class IPresenter<T : IView>(v: T) { open var mView: SoftReference<T> = SoftReference(v) open fun onCreate(intent: Intent?) { mView.get()?.initView() } open fun onStart() {} open fun onResume() {} open fun onPause() {} open fun onStop() {} open fun onDestroy() {} open fun onCreateView(arguments: Bundle?) {} }
定義IView介面,持有一個mPresenter屬於上面定義的IPresenter型別,這個mPresenter就是實現IView介面例項的Presenter層具體例項,因為kotlin可以在介面定義屬性,實現介面的例項必須給mPresenter賦值。然後放一些共用的方法,比如彈出對話方塊,toast之類的
package com.khaless.demo.mvp import android.content.Context import android.widget.Toast /** * Author: Li Hai Kun * Description: * Date: 2017/6/2 */ interface IView { val mPresenter: IPresenter<out IView> fun initView() fun showProgressDialog(){ } fun dismissProgressDialog(){ } fun showToast(text:String,context: Context,time:Int=Toast.LENGTH_SHORT){ Toast.makeText(context,text,time).show() } }
一個Base類,用一個set記錄當前View層所有的Presenter,這樣做的好處就是有些複雜的頁面可以放多個presenter。在onCreate方法裡獲取呼叫addPresenters()方法獲取所有presenter,預設把定義的mPresenter新增,如果有多個的話可以在具體實現類重寫這個方法。然後就是呼叫每一個生命週期方法。最後可以根據實際情況實現IView定義的一些共用方法,比如對話方塊彈出。
package com.khaless.demo.mvp import android.app.Activity import android.os.Bundle import java.util.* /** * Author: Li Hai Kun * Description: * Date: 2017/6/2 */ abstract class BaseActivity: Activity(),IView { private val mAllPresenters = HashSet<IPresenter<*>>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(getLayoutId()) addPresenters() mAllPresenters.forEach { it.onCreate(intent) } } open fun getPresenters():MutableList<IPresenter<*>>{ return mutableListOf(mPresenter) } private fun addPresenters() { getPresenters().forEach { mAllPresenters.add(it)} } override fun onStart() { super.onStart() mAllPresenters.forEach { it.onStart() } } override fun onResume() { super.onResume() mAllPresenters.forEach { it.onResume() } } override fun onPause() { super.onPause() mAllPresenters.forEach { it.onPause() } } override fun onStop() { super.onStop() mAllPresenters.forEach { it.onStop() } } override fun onDestroy() { super.onDestroy() mAllPresenters.forEach { it.onDestroy() } } abstract fun getLayoutId():Int override fun showProgressDialog() { super.showProgressDialog() } override fun dismissProgressDialog() { super.dismissProgressDialog() } }
接著就是具體實現,假設有一個需求,view層點選新增使用者按鈕,presenter層將當前輸入的使用者資訊做校驗或者是一些其他操作,然後呼叫model層實現新增使用者的操作,model層完成後將結果告訴presenter層,最後presenter層將具體結果顯示在view層,在新增的過程中可能需要view層轉個菊花什麼的提示正在新增使用者。
首先是model層,model層主要是做一些具體的操作:
用單例實現,而kotlin寫一個單例是相當的簡單,object即可。一個新增使用者的方法,最後一個引數傳遞一個lambda表示式,用於通知presenter操作結果。表示式作為最後一個引數的寫法我非常喜歡,一個是不用像JAVA那樣定義一個介面,然後再回調,再一個是呼叫的地方後面加一個大括號即可。
接著是P層,首先定義UserContract,定義這個模組view層和presenter層的抽象方法
package com.khaless.demo.presenter import com.khaless.demo.mvp.IView /** * Author: Li Hai Kun * Description: * Date: 2018/3/23 */ interface UserContract { interface IUserView : IView { fun showAddUserResult(boolean: Boolean) } interface IUserPresenter{ fun addUser(name:String) } }
然後就是presenter具體實現,實現抽象介面的方法
package com.khaless.demo.presenter import android.text.TextUtils import com.khaless.demo.model.UserModel import com.khaless.demo.mvp.IPresenter /** * Author: Li Hai Kun * Description: * Date: 2018/7/13 0013 */ class UserPresenter(view: UserContract.IUserView):UserContract.IUserPresenter,IPresenter<UserContract.IUserView>(view) { override fun addUser(name: String) { //彈出對話方塊 mView.get()?.showProgressDialog() //做一些校驗 if (!TextUtils.isEmpty(name)){ UserModel.addUser(name) { //關閉對話方塊並顯示結果 mView.get()?.dismissProgressDialog() mView.get()?.showAddUserResult(it) } } } }
最後就是view層的具體實現
package com.khaless.demo.view import com.khaless.demo.R import com.khaless.demo.mvp.BaseActivity import com.khaless.demo.presenter.UserContract import com.khaless.demo.presenter.UserPresenter import kotlinx.android.synthetic.main.activity_main.* class MainActivity: BaseActivity(),UserContract.IUserView { override val mPresenter: UserPresenter= UserPresenter(this) override fun getLayoutId(): Int = R.layout.activity_main override fun initView() { tvUser.setOnClickListener { mPresenter.addUser("卡麗熙") } } override fun showAddUserResult(boolean: Boolean) { if (boolean){ tvUser.text = "新增使用者成功" }else{ tvUser.text = "新增使用者失敗" } } }
比較簡單,但是大概這就是MVP模式的主要結構了
以上這篇使用kotlin實現MVP的方式(簡單好用)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。