我们用RecyclerView来显示一个好友列表,数据从远程服务器数据库获得,然后就是一个非常适合的MVP模式的例子,Model负责通过Okhttp获取数据,Presenter接收Model的数据,处理后,通知View更新,非常标准的一个MVP模式。
首先看MVP的接口定义IModel、IView、IPresenter,通常都是把它们放到一个Contact接口类中统一管理:
import okhttp3.Callback
interface Contact {
interface IView{
fun setData(friendList:MutableList<FriendInfo>)
fun onError(type:Int)
}
interface IModel{
fun loadData(params:Map<*, *>, callback:Callback)
fun addOrRemoveFriend(params:Map<*, *>, callback:Callback, type:Int)
fun addUser(params:Map<*, *>, callback:Callback, type:Int)
}
interface IPresenter{
fun attachView(view: IView)
fun detachView()
fun loadData(token:String)
fun addOrRemoveFriend(token:String, friendToken:String, type:Int)
fun addUser(token:String)
}
}
再看我们的View,通常指Activity,与Presenter的交互:
1)绑定与解绑
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_friend_list)
setSupportActionBar(toolbar)
mPresenter = FriendPresenter()
mPresenter.attachView(this)
initListView()
}
override fun onDestroy() {
super.onDestroy()
mPresenter.detachView()
}
在Presenter中:
private lateinit var mViewRef: WeakReference<Contact.IView>
private lateinit var mModel:Contact.IModel
override fun attachView(view: Contact.IView) {
mViewRef = WeakReference(view)
mModel = FriendModel()
}
override fun detachView() {
mViewRef.clear()
}
为了避免内存泄漏,这里使用是弱应用
2)数据的交互
View:
override fun setData(friendList: MutableList<FriendInfo>) = runOnUiThread{
mAdaper.setData(friendList)
}
Presenter:
override fun loadData(token:String) {
val map = HashMap<String