关于Android开发的MVP模式,P层对V层的处理

项目中采用了MVP模式进行开发,在搭建框架的时候,由于用到了RxJava+Retrofit进行网络请求,M层不好做封装,所以网络请求统一在Preseter层发送,包括请求回调。
现在我想在所有网络请求过程中显示进度条,请求结束关闭进度条,但是BasePresenter中又没有context传给进度条用来显示,应该怎么设计?一定要把BaseActivity传入BasePresenter吗?
ps.进度条当然可以在每个请求发起和结束回调中处理,但是每个请求都这样做显然很麻烦。我就想统一做一些View(V层)的处理,MVP模式貌似在这方面并不好实现

阅读 7.5k
5 个回答

为什么不能把进度条的进度理解为一个Model里的值呢?
Presenter更新这个用于进度条的Model,
而View根据这个Model去绘制进度条的长度,
这不就和普通的拉取数据,装入模型,交给View显示一个道理嘛!

新手上路,请多包涵

你可以继承Subscriber写一个订阅者,通过构造方法传递一个Context进去,然后分别在onStart里面显示一个进度条,onComplete和onError里关闭进度条,至于如何显示和关闭,可以通过Handler来做。看到你的问题我想起来之前看到过类似问题的解决方法,给你找了下,在这里https://github.com/tough1985/... 当然你可以在自定义你想要的进度条或者进度条对话框,通过Handler发送消息去显示和隐藏。

我找到一个方法分享给大家:
1、首先创建BasePresenter和BaseView(接口),所有的Presenter和view都继承Base,然后BaseView中声明公用方法比如createProgressDialog和closeProgressDialog。
2、然后BasePresenter定义一个带BaseView参数的构造函数,这样你的每一个presenter由于都继承了BasePresenter,所以都必须实现一个带BaseView参数的构造函数,并且构造函数里面有super方法。这样就在实例化自己的presenter时传入了BaseView给BasePresenter。
3、最后BaseActivity中实现BaseView接口的方法供BasePresenter调用。
这样做不用传递Context上下文,也不用再presenter中直接进行UI操作,而是通过在Base层建立View和Presenter关联实现UI和业务逻辑隔离,更加符合MVP架构的思想

一定要把BaseActivity传入BasePresenter吗?
这样就成了MVC了.

进度可以同样注册成接口回调就行了. 如果不能直接到UI线程回调, 那么就用hander转发.

从职责上来看,你也不应该修改BasePresenter以求能够处理网络请求显示进度条的问题,这并不是BasePresenter该做的事情,也不是BaseView该做的事情。因为并不是每个View都需要显示进度条。

solution:

    1. 你可以从Application上获取getApplicationContext(),然后直接显示。
      但这并不是一个好的方法,因为直接在Presenter里显示ProgressDialog不符合设计的初衷。

    1. 每个需要显示ProgressDialog的View,在View 接口中定义showProgressDialog即可,然后每个请求回调update progress时,getUi().showProgressDialog()即可。这样就做到分离了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题