1.问题:
>具体到上面的demo里就是,Activity负责发起下载任务,但是不负责具体实现;什么时候显示ProgressDialog,显示多少?什么时候提示错误信息,这一切都希望有个东西能直接告诉Activity,而不再是在Activity里再做判断。怎样才能做到呢?那就得靠MVP 了。
2.MVP
> MVP 模式所做的事情很简单,就是将业务逻辑和视图逻辑抽象到接口中。
> >定义Model,View,Presenter 接口
> >
>1. Model Interface
>Model 接口定义所有需要实现的业务逻辑,在我们的下载任务中,业务逻辑只有一个,就是下载;
```
public interface IDownloadModel {
/**
*下载操作
*@param url
*/
void download(String url);
}
```
>2.View 接口定义所有需要实现的视图逻辑,在我们的下载任务中,视图逻辑包括
>>
-显示ProgressDialog;
-显示Dialog具体进度;
-显示具体的View(设置图片);
-显示错误信息(Toast提示)
>>3.Presenter Interface
>resenter 接口作为连接Model和View的中间桥梁,需要将二者连接起来,因此他需要完成以下工作:
public interface IDowndownPresenter {
/**
*下载
*@param url
*/
void download(String url);
/**
*下载成功
*@param result
*/
'''
void downloadSuccess(String result);
/**
*当前下载进度
*@param progress
*/
void downloadProgress(int progress);
/**
*下载失败
*/
void downloadFail();
}
## 总结:
简单点来说就是 model去实现下载任务并且独立出来,而View负责的是view的动态变化,Presenter 去连接model和
View实现交互,在主Activity中我们可以继承View中的接口以及实例化Presenter的具体实现类,View接口继承的方法中我们在对应的方法中使用Presenter去实现业务逻辑。
##猫眼APP中的MVP框架理解:
1.首先它创建了一个library,把一些基本的类以及有关网络的一些类也写在里面
2.接下来我们来初步理解下他的MVP框架,
> 在这个library中,他的具体的视图逻辑定义了一个类ICoreLoadingView来显示视图,该类具体有如下几个方法:
public interface ICoreLoadingView {
void showLoading();
void showContent();
void showError(String errorMsg);
}
>由于是一个基本的类,说以我们只是和视图接口实现了连接下面我们来看看这个基本类中实现得方法:
public interface ICorePresenter {
void onViewStop();
void onViewDestroy();
}
3.既然我们已经定义了具体的ICorePresenter接口,现在我们就应该定义一个基本的类来实现这个接口,BaseMVPPresenter 继承自ICorePresenter,值得注意的是我们可以看到它在构造方法中接受了两个数据,Activity mActivity和T mView来一边在我们具体的实现的时候来实现我们的业务逻辑和视图逻辑的交互,还有就是由于项目使用的是Rxjava+retrofit+MVP 模式的编程我们还使用CompositeDisposable这个容器来实现订阅事件的创建与回收。
4 . 下面我们来看看在具体的项目中我们是怎么去实现MVP框架的,我们就以这个热门页面为例,首先我们可以看到我们定义了两个热门页独立的接口,视图逻辑接口:
public interface IHotMovieListView extends ICoreLoadingView {
void addHotMovieList (List hot);
void addMovieIds(List movieIds);
void addMoreMovies(List movies);
void loadMoreError();
void loadMoreCompleted();
}
-第二个接口就是我们的IHotMoviePresenter:
public interface IHotMoviePresenter{
void getHotMovieList(int limit);
void getMoreHotMovieList(int headline,String movieIds);
}
那我们的业务逻辑接口我们又应该怎么去实现呢?
我们写了一个网络热门页数据请求的管理类HotMovieListManager来实现数据的请求,在我们的presenter接口实现HotMovieListPresenter(继承自BaseMVPPresenter 以及独立接口IHotMoviePresenter)我们在这里把网络请求添加到容器中,让后我们可以在fragment中来讲继承我们所写的实现接口。