MVP架构
- MVP架构 分离Activity的model层功能,只作为view层,增加presenter层构建连接;
- 一种处理视图与数据模型关系的一种设计模式架构
- MVC的升级版,基本上一致,把C改为P
- 下面自己在Android上的MVP实现方式,自己感觉理解起来比较通顺.
- 将Activity作为controller,将导致Activity代码臃肿,将一部分业务逻辑移除成为Presenter层,Model层可有可无,就像之前的MVC,全挤在Activity,倒不如称之为MV模式,
- 现在增加P层,M层逻辑也可在P层实现.PV模式,Acitivty主要负责视图部分.如果业务逻辑负责,P层也会代码爆炸.所以MVP跟MVP本质上是一致的.
Contract(契约类)
- 统一显示MVP各层需要对外提供调用的方法
- 再由各层实现各自方法
public interface AndroidContract {
interface View<T> {
void refreshListByData(List<T> data);
```
void showErrorView();
}
interface Presenter{
void setPageRows(int page_rows);
void refreshList();
```
void onDestroy();
}
interface Model{
Observable<GankBean> getAndroid(int page_rows, int page);
}
}
Mode层
public class AndroidModel implements AndroidContract.Model{
@Override
public Observable<GankBean> getAndroid(int page_rows,int page){
GankServer gankServer = RetrofitHelper.getInstance().getGankServer();
Observable<GankBean> andriod = gankServer.getAndriod(page_rows, page);
return andriod;
}
}
View层
public class AndroidFragment extends BaseListFragment<GankEntity> implements
AndroidContract.View<GankEntity> {
public static final String TAG="Android";
private AndroidPresenter mPresenter;
public AndroidFragment( ) {
Log.d("AndroidFragment",TAG);
}
```
@Override
protected WBaseAdapter setAdapter() {
AndroidAdapter androidAdapter = new AndroidAdapter(null);
return androidAdapter;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mPresenter = new AndroidPresenter(this);
mPresenter.setPageRows(page_rows);
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
onRefresh();
Log.d("AndroidFragment",TAG+"onResume");
}
@Override
public void onRefresh() {
super.onRefresh();
mPresenter.refreshList();
}
```
@Override
public void onDestroyView() {
super.onDestroyView();
mPresenter.onDestroy();
}
}
Presenter层
- 持有View 及Model层
- 调用Model层数据请求,通过接口获取结果
- 根据结果调用View层的方法刷新UI
public class AndroidPresenter implements AndroidContract.Presenter{
private AndroidContract.View mView;
private final AndroidContract.Model mModel;
private ArrayList<Disposable> mDisposableList=new ArrayList<>();
private int mPage_rows;
public AndroidPresenter(AndroidFragment fragment) {
this.mView = fragment;
mModel = new AndroidModel();
}
/**
* 每页行数
* @param page_rows
*/
@Override
public void setPageRows(int page_rows) {
mPage_rows = page_rows;
}
/**
* 刷新列表
*/
@Override
public void refreshList() {
Observable<GankBean> android = mModel.getAndroid(mPage_rows, 1);
android.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<GankBean>() {
Disposable mDisposable;
@Override
public void onSubscribe(Disposable d) {
mDisposableList.add(d) ;
mDisposable=d;
}
@Override
public void onNext(GankBean gankBean) {
if(mView!=null&&!gankBean.error)
{
mView.refreshListByData(gankBean.results);
}
}
@Override
public void onError(Throwable e) {
if(mView!=null )
{
mView.showErrorView();
}
}
@Override
public void onComplete() {
mDisposableList.remove(mDisposable);
}
});
}
```
/**
* 销毁 等待回收
*/
@Override
public void onDestroy()
{
```
mView=null;
}
}
总结
- 在P层与M层之间可以再增加一个数据返回接口,进一步解耦
- Android的View层通常由XML来表示,功能上稍显不足,需要由Activity来加以辅助,处理一些监听事件,感觉上有点大材小用了.
- Google推出的架构Android Architecture Components(ViewModel、LiveData等),是MVVM模式,可见MVP在Android实现上并不是很好.
- 毕竟,MVC都处理不好的,MVP估计也差不了多少