⑴ Android MVP模式中,一个Activity对应多个Presenter时该怎样抽象
View 和 Presenter 之间是有协议约束的.
假设现有V1, P1, V2, P2, 一个ActivityA对应了P1/P2的功能, 也应该说明它实现了V1/V2接口, 此时应该有PresenterA 实现了P1, P2. 这就是完整的VP的协议就对上了.
这里既然多个页面可能用到同样的功能, 最简单的方式节点使用多继承(一个Persenter实现ABCD四个接口), 这样不管Activity实际上用的都是同一个Persenter.如果确定现在已经有实现了, 按楼上的方法实现一个代理就可以了.
实在要实现多个Presenter的话, 可以定义几个不同的类, 来支持不同多个Presenter的扩展:
class BaseMvpActivity1<P> extent BaseActivity {
P presenter;
}
class BaseMvpActivity2<P1, P2> extent BaseActivity {
P1 presenter1;
P2 presenter2;
}
但不推荐这样做(失去抽象, 违反依赖倒置原则); 更不推荐使用数组或List(基类使用泛型方便编译器检查, 数组或List在具体使用时需要做类型的强转)
⑵ Android MVP架构中的Presentation层应该怎么设计
先区分一下Android View、View、界面的区别
Android View: 只是继承android.view.View的Android组件。
View:接口,用于由presenter向View实现类通信,你可以在Android组件中实现它。有时最好直接使用Activity,Fragment或自定义View。
界面:界面是面向用户的概念。比如要在手机上进行界面间切换时,我们在代码中可以通过多种方式实现,如Activity到Activity或一个Activity内部的Fragment/View进行切换。所以这个概念基于用户的视觉,包括了所有View中能看到的东西。
切换界面
界面间的切换可以是两个Fragment、两个Activity、打开对话框、启动新Activity等等。当然切换的具体实现原理不属于这篇文章的内容,而进行切换操作则是Presentation层的职责。Presenter应该知道要做什么,而它的实现类要知道怎么完成。在这个例子中,要做的就是切换界面,完成方式就是启动新的Activity。
但这样会有一个问题。Presentation层是纯java代码,所以Presenter中不应该有任何与安卓相关的代码。那怎么完成界面的切换呢?通过抽象。这里可以写一个只有一个navigate()方法的接口NavigationCommand。在需要时我们在Presenter中调用这个接口的navigate()方法,然后在Activity中实现这个接口。
代码长这样:
View层
ActivityA.java
public class ActivityA extends Activity {
@OnClick(R.id.someButton)
public void onSomeButtonClicked() {
presenter.onSomeButtonClicked();
}
ToActivityB.java
public class ToActivityB implements NavigationCommand {
private final Activity currentActivity;
public ToActivityB(Activity activity) {
currentActivity = activity;
}
@Override
public void navigate() {
currentActivity.startActivity();
}
}
Presentation层
NavigationCommand.interface
public interface NavigationCommand {
public void navigate();
}
PresenterA.java
public class PresenterA {
private final NavigationCommand toBNavigation;
public PresenterA(NavigationCommand toBNavigation) {
this.toBNavigation = toBNavigation;
}
public void onSomeButtonClicked() {
toBNavigation.navigate();
}
}
这样我们就可以将VP两层解耦。这里将切换到一个Activity的代码提取出来,可以复用,我们可以通过注入NavigationCommand方法来测试Presenter,而且就算要跳转的页面变了,Presenter的代码也不变。这也符合Open Close原则。
另一个问题就是当一个Presenter中出现多个NavigationCommand时,构造方法就开始变得诡异了。
public class PresenterA {
private final NavigationCommand toBNavigation;
private final NavigationCommand toCNavigation;
public PresenterA(NavigationCommand toBNavigation, NavigationCommand toCNavigation) {
this.toBNavigation = toBNavigation;
this.toCNavigation = toCNavigation;
}
}
在这里初始化Presenter的类很难搞清楚两个NavigationCommand之间的顺序,似乎只能通过名字来辨识,这里其实可以再写一个接口继承NavigationCommand来专门管理一类特定的切换,或者如果你使用依赖注入框架的话也可以指定参数的类型。
有时需要在切换界面时传递一些参数,这时就要改动一下NavigationCommand的代码:
public interface ToScreenBNavigationCommand extends NavigationCommand {
void setMyParameterToNavigate(String parameter);
}
⑶ Android MVP 开发模式有哪些优缺点
MVP概念:
MVP(Model-View-Presenter) 是总所周知MVC模式的一个演变,主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用。
层级责任
Model:负责数据的检索,持久化等操作。
View: 负责UI的绘制和用户的交互。
Presenter: 作为Model和View的中间协调部分,负责两者之间的业务逻辑处理。
MVC模式的区别
MVC模式允许View层和Model层直接通讯。
当某个View的功能很复杂的时候,View和Model的耦合度可能会很高。
MVP模式就没有这个问题,View会抽象出来一系列操作UI的接口。
Presenter拿到的都是其他两个层级的接口来做业务逻辑的处理,这样不仅可以使View和Model之间的耦合度降低,还可以更易得进行单元测试。
MVP的优缺点
优点:降低耦合,层级职责更明显,易于单元测试。
缺点:造成类数量爆炸,代码复杂度和学习成本高,在某些场景下presenter的复用会产生接口冗余。
⑷ 如何理解android mvp模式中的interactor
Presenter起到的其实就是一个粘合剂的角色。
它调度了UI逻辑和数据逻辑,然而UI逻辑和数据逻辑的具体实现,Presenter是不用关心的,只需要处理好如何调度,和状态处理即可。
理解这个之前,你需要理解Model 和 ViewModel,一个Model也就是我们平常说的JavaBean,例如一个User类,它有自己的基本属性。姓名,年龄,用户名,密码等等。
而ViewModel代表的是视图的Model,例如一个登陆视图,它的ViewModel包含用户名,密码。
所以Model是不能直接被视图使用的,我们需要转换成ViewModel的形式,然后绑定到视图上。
你可能会说,我也可以直接绑定Model的属性到View上,但是这样View和Model就不是相互独立的了,也就违背了我们使用MVP、MVVM的初衷。
Interactor的作用实际上就是获取Model(从本地数据库,或者是服务器),转换成ViewModel,回调通知把ViewModel传递给Presenter。
Presenter实现了Interactor的回调接口,可以接收到ViewModel的实例,此时它在回调函数里面只需要将接收到的ViewModel绑定的View上面即可。
可以看到,在这个过程中Presenter并没有触及到具体的实现,只是把View 和 ViewModel进行了绑定而已。
当然你也可以把数据逻辑写在Presenter,但是Interactor就不存在了,其实Interactor也是可以重用的
作者:面条
链接:http://www.hu.com/question/38528132/answer/77390722
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
⑸ 如何实现自己的Android MVP框架
实现Android MVP框架
一个经典的 Android MVC 框架项目的代码结构
MVP减负activity ,承担了 view 层和 controller 层的工作
View 层的 ActivityActivity 里包含: View 层的对外接口 MainView, P层 Presenter
对外接口 MainView 文件
P层代码
文件
DataManager.java
TaskDataSource.java
TaskDataSourceImpl.java
TaskDataSourceTestImpl.java
Android 版方案
通过新建子线程进行IO读写获取数据
以主线程的 Looper 将结果通过传回主线程进行渲染和展示。
⑹ android mvp adapter该怎么写
adapter一般叫适配器,所以顾名思义,它是根据不同数据模型来适配出不同的数据展示效果,而自身不需要进行相应的修改操作。
mvp 分别是 model view controller ,个人感觉adapter应该归到controller这个部分合适。
⑺ 如何一步一步实现Android的MVP框架
实现Android MVP框架
一个经典的 Android MVC 框架项目的代码结构
⑻ 如何一步一步实现Android的MVP框架
实现Android MVP框架一个经典的 Android MVC 框架项目的代码结构
MVP减负activity ,承担了 view 层和 controller 层的工作
View 层的 ActivityActivity 里包含: View 层的对外接口 MainView, P层 Presenter对外接口 MainView 文件
P层代码
文件
DataManager.java
TaskDataSource.java
TaskDataSourceImpl.java
TaskDataSourceTestImpl.java
Android 版方案通过新建子线程进行IO读写获取数据
以主线程的 Looper 将结果通过传回主线程进行渲染和展示。
⑼ android mvp mvvm怎么选择 简书
1.MVC
传统的Android App其实都是基于MVC的,Activity,Fragment相当于C,布局相当于V,数据逻辑相当于M
随着业务的增长Controller里的代码会越来越臃肿,因为它不只要负责业务逻辑,还要控制View的展示。也就是说Activity、Fragment杂糅了Controller和View,耦合变大。并不能算作真正意义上的MVC。
这也是为什么后面的MVP会引起很多开发者兴趣的原因了。
2.MVP
MVP架构其实可以说与MVC的架构还是有很大的差别的,数据逻辑相当于M,Activity(负责View的绘制以及与用户交互)相当于V ,View于Model间的交互则为P
理论上感觉区别有点抽象,可以通过下面的图来看一看其中的区别
⑽ 如何实现自己的Android MVP框架