How to code the MVP in Android
- 这是一个缩略版的MVP结构,实际上,还可以注入更多的生命周期内容,因为这里只是为了简单介绍MVP的模式,在实际开发过程中,我们很少会再去使用这种开发模式了,所以这里就不详细讲了。
- 当然如果能借助AutoService,使用可以变得更加方便。(不过,这直接上MVVM就行了)
MVP with Kotlin
kotlin
interface IContract {
interface IViewRender {
fun callback(message: String)
}
interface IPresenter {
fun fetchData()
// To Bind the lifecycle Access Process Interface
fun attachView(viewRender: IContract.IViewRender)
fun detachView()
}
}
class View : IContract.IViewRender {
private val presenter: Presenter = Presenter()
override fun onViewCreated() {
presenter.attachView(this)
presenter.fetchData()
}
override fun onDestroy() {
// Cancel any network requests in Presenter
presenter.detachView()
}
override fun callback(message: String) {
mBinding.tvInfo.text = message
}
}
// Presenter
class Presenter : IContract.IPresenter {
private var viewRender: IContract.IViewRender? = null
private val mCompositeDisposable = CompositeDisposable()
override fun fetchData() {
Single.create<String> { emitter ->
Thread.sleep(2000L) // Simulate a time-consuming operation
emitter.onSuccess("Hello World")
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object: SingleObserver<String> {
override fun onSubscribe(disposable: Disposable) {
mCompositeDisposable.add(disposable)
}
override fun onSuccess(result: String) {
viewRender?.callback(result)
}
override fun onError(e: Throwable) = Unit
})
}
override fun attachView(viewRender: IContract.IViewRender) {
this.viewRender = viewRender
}
override fun detachView() {
mCompositeDisposable.clear()
viewRender = null
}
}- 实际上,这里的意思就是使用Activity/Fragment的生命周期中的销毁时机去取消网络请求,防止callback向生命周期已经销毁但对象还没有回收的页面去做数据刷新导致可能出现的NullPointException.