前言
在前一章中,题主虽然没有展开讲解MVPO究竟是啥东西,但也针对传统MVP做出了一点改进。而在这一章中,我们将继续探讨第二个问题,并引出MVPO框架模式。
传统MVP的第二个问题
假如有这样一个需求:App先通过接口从服务器获取时间戳,再通过蓝牙把这个时间发给IOT设备,最后App再通过网络请求上报服务器处理结果。为了方便理解,下面这个图展示了该需求:

针对以上需求,传统MVP一般这样做:写一个Presenter包含网络请求和蓝牙交互的所有逻辑。但这样一来,P层就会很臃肿。而且还有另一个问题,如果某个页面只想用获取时间戳的操作,那这个Presenter对于这个页面显然过于“浪费”。
解决之道
题主解决上面问题的方法,其实就是用MVPO框架,简单说就是在MVP的基础上,加多一层O(Operator)。
还是用代码说话,针对上面提到的需求,如果用MVPO框架,关键两层的代码如下:
CommandPresenter
public class CommandPresenter {
/**
* 从服务器获取时间戳
*/
public static void getCommand(String type, BaseObserver<TimeResult> observer) {
observer.addParam("type", type)
.post(AppConfig.UrlConfig.GET_COMMAND);
}
SyncTimeOperator
/**
* 同步时间操作类
* @author LvQiSheng
* @date 2019/5/27
*/
public class SyncTimeOperator {
private SyncTimeCallback mCallback;
public interface SyncTimeCallback {
void onFailure(String msg);
void onSuccess();
}
public SyncTimeOperator(SyncTimeCallback callback) {
this.mCallback = callback;
}
/**
* 执行完整操作
*/
public void execute() {
getServerTime();
}
/**
* 从服务器获取时间戳
*/
private void getServerTime() {
CommandPresenter.getCommand("1", new BaseObserver<TimeResult>(null) {
@Override
public void onSuccess(TimeResult timeResult) {
sendTimeBytBle(timeResult.getTime());
}
@Override
public void onError(String code, String msg) {
mCallback.onFailure(msg);
}
});
}
/**
* 通过蓝牙把时间同步给IOT设备
*/
private void syncTimeIot(long time) {
BleManager.sendDatasByMac(mac, time, new BleSendDataCallback() {
@Override
public void onFailure(ErrorType errorType, BleException exception, String sendCmd) {
mCallback.onFailure(exception.toString());
}
@Override
public void onDataReceived(String mac, byte[] data) {
reportResult(true);
}
});
}
/**
* 上报结果给服务器
*/
private void reportResult(boolean isSuccess) {
CommandPresenter.reportResult("1", isSuccess, new BaseObserver<CommandResult>(null) {
@Override
public void onSuccess(CommandResult commandResult) {
mCallback.onSuccess();
}
@Override
public void onError(String code, String msg) {
mCallback.onFailure(msg);
}
});
}
}
解释
- Presenter还是只专注于网络请求,相当于一块积木。
- 蓝牙交互的封装(BleManager)则是另一块积木。
- 以上两块积木,可以单独使用。比如某全页面只需要网络请求,则调Presenter。如果只有蓝牙交互,则调BleManager。
- 当View层夹杂着网络请求加蓝牙交互等复杂操作时,则新建一个Operator,把以上两块积木组合起来便可。
结语
本文介绍了一种改进后的MVP框架模式——MVPO,适用于逻辑比较复杂的App。个人认为,物联网产品的App会比较适用,也欢迎各位Android开发的小伙伴提出改进意见。
网友评论