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估計也差不了多少