
由图可见MVC模式Model View Controller他们三者之间的关系是互相相通的 缺点就是:一旦一方改变就会牵连到另外一方,耦合度较高。MVP模式Model View Presenter他们三者之间关系都会经过Presenter,起到一个隔离数据的作用,分工更明确。 为什么要用MVP? 利于项目维护,代码结构更清晰。MVP模式 MVC模式的结构分为三部分,实体层的Model,视图层的View,以及控制层的Presenter。 Model:层就是JavaBean实体类,用于保存实例数据和请求网络数据(耗时操作) View:层其实就是程序的UI界面,用于向用户展示数据以及接收用户的输入
Presenter:控制器用于更新UI面和数据实例 MVP的实现 在项目中的结构图:  代码的实现 Model层:写一个接口进行回调数据 package com.mvpframework.activity.listpageactivity.entityclass;
import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import java.util.List;
/**
* 请求网络数据
*/
public interface IPalmBusEntity {
//获取数据
void getData(PalmBusEntity.LoadDataCallback callback);
void getBusInfo_new(String[]strings);
interface LoadDataCallback {
void getBusData(List<BusInfo>mList);
void getBusInfo(String[]strings);
}
}
进行Model的实际操作package com.mvpframework.activity.listpageactivity.entityclass;
import android.util.Log;
import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import com.mvpframework.config.API;
import com.mvpframework.networkrequest.HttpCallBack;
import com.mvpframework.networkrequest.HttpProxy;
import java.util.HashMap;
/**
* 公交站查询-请求数据层
*/
public class PalmBusEntity implements IPalmBusEntity {
private HashMap<String, Object> params = new HashMap<>();
private final static String APP_KEY = "";
private String mStart,mStop;
@Override
public void getData(LoadDataCallback callback) {
params.put("key", APP_KEY);
params.put("city",mStart);
params.put("bus", mStop);
HttpProxy.obtain().post(API.BUS_QUERY, params, new HttpCallBack<String>() {
@Override
public void onFailure(String string) {
Log.d("网络请求", "----------------------请求失败------------------");
}
@Override
public void onSuccess(String busInfo) {
StringBuffer stringBuffer = new StringBuffer();
//if (busInfo != null) {
//stringBuffer.append(busInfo.getResult());
Log.d("网络请求", "-------------------请求成功------------------" + busInfo);
//}
}
});
}
@Override
public void getBusInfo_new(String[]strings) {
for (int i=0;i<=strings.length;i++){
mStart=strings[0];
mStop=strings[1];
}
}
}
Presenter层负责View层和Model的数据交互 package com.mvpframework.activity.listpageactivity.presenter;
/**
* 交互层
*/
public interface IPalmBusPresenter {
void loadData();
}
Presenter实际操作 package com.mvpframework.activity.listpageactivity.presenter;
import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import com.mvpframework.activity.listpageactivity.entityclass.IPalmBusEntity;
import com.mvpframework.activity.listpageactivity.entityclass.PalmBusEntity;
import com.mvpframework.activity.listpageactivity.view.IPalmBusView;
import java.util.List;
/**
* 公交站查询-数据交互层
*/
public class PalmBusPresenter implements IPalmBusPresenter{
private IPalmBusEntity iPalmBusEntity=new PalmBusEntity();
private IPalmBusView iPalmBusView;
public PalmBusPresenter(IPalmBusView iPalmBusView){
this.iPalmBusView=iPalmBusView;
}
public PalmBusPresenter(IPalmBusEntity iPalmBusEntity){
this.iPalmBusEntity=iPalmBusEntity;
}
@Override
public void loadData() {
//显示查询到公交的结果
if (iPalmBusEntity!=null){
iPalmBusEntity.getData(new IPalmBusEntity.LoadDataCallback() {
@Override
public void getBusData(List<BusInfo> mList) {
iPalmBusView.showData(mList);
}
@Override
public void getBusInfo(String[]strings) {
//从视图层获取到数据通过p层交互数据到m层
if (iPalmBusView!=null){
iPalmBusView.getShowBusData(strings);
}
}
});
}
}
}
View接口回到数据 package com.mvpframework.activity.listpageactivity.view;
import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import java.util.List;
/**
*显示层
*/
public interface IPalmBusView {
//显示数据
void showData(List<BusInfo> mList);
void getShowBusData(String[]strings);
}
View显示数据 package com.mvpframework.activity.listpageactivity.view;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.mvpframework.R;
import com.mvpframework.activity.listpageactivity.busentity.BusInfo;
import com.mvpframework.activity.listpageactivity.presenter.IPalmBusPresenter;
import com.mvpframework.activity.listpageactivity.presenter.PalmBusPresenter;
import java.util.List;
/**
* 公交站查询-显示数据层
*/
public class PalmBusView extends Activity implements IPalmBusView {
private IPalmBusPresenter iPalmBusPresenter;
private EditText start, stop;
private Button query;
public String ed_start, ed_stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_palm_bus);
init();
}
private void init() {
//Presenter的实例
start = (EditText) findViewById(R.id.start);
stop = (EditText) findViewById(R.id.stop);
query = (Button) findViewById(R.id.query);
query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
iPalmBusPresenter = new PalmBusPresenter(PalmBusView.this);
iPalmBusPresenter.loadData();
ed_start = start.getText().toString().trim();
ed_stop = stop.getText().toString().trim();
}
});
}
//显示数据
@Override
public void showData(final List<BusInfo> mList) {
}
//从视图层传递数据到p层
@Override
public void getShowBusData(String[]strings) {
if (strings==null){
strings=new String[]{ed_start,ed_stop};
}
}
}
以上就是MVP的基本实现,但是在实际开发中这么写不的累死,对以上MVP进行进一步的封装: 首先把一直在做重复工作的抽出一个基类进行复用: Activity基类: package com.wj.mvp.base;
import android.app.Activity;
import android.os.Bundle;
/**
* 基类
*/
public abstract class BaseActivity<V,T extends BasePresenter<V>> extends Activity{
private static final String TAG = "BaseActivity";
//交互层
public T presenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
presenter=createPresenter();
//加载数据
presenter.attachView((V)this);
}
protected abstract T createPresenter();
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView();
}
} Presenter基类
package com.wj.mvp.base;
import java.lang.ref.WeakReference;
/**
* 交互层
*/
public class BasePresenter<T> {
//获取到view层的引用
protected WeakReference<T>mViewRef;
//进行绑定
public void attachView(T view){
mViewRef=new WeakReference<T>(view);
}
//解绑
public void detachView(){
mViewRef.clear();
}
}
Model层 package com.wj.mvp.view.customizedarea.model;
import com.wj.mvp.entity.CustomizedArea;
/**
* 数据源
*/
public interface ICustomizedAreaModel {
void getData(CustomizedAreaModel.getLoadData loadData);
interface getLoadData {
void onSuccess(CustomizedArea customizedArea);
void onFail();
}
}
package com.wj.mvp.view.customizedarea.model;
import android.util.Log;
import com.wj.mvp.config.ApiService;
import com.wj.mvp.entity.CustomizedArea;
import com.wj.mvp.network.OkHttpNetwork;
import com.wj.mvp.network.RetrofitHelper;
import java.util.HashMap;
import rx.Observable;
/**
* 数据源
*/
public class CustomizedAreaModel implements ICustomizedAreaModel {
private static final String TAG = "CustomizedAreaModel";
HashMap<String, Object> map;
@Override
public void getData(final getLoadData loadData) {
if (map==null){
map=new HashMap<>();
map.put("custom_hot",20);
map.put("custom_post",20);
map.put("custom_design",20);
}
Observable<CustomizedArea> observable = RetrofitHelper.getService(ApiService.class).getWorkSharing(map);
OkHttpNetwork.doPostRequest(observable, new OkHttpNetwork.OnResultListener<CustomizedArea>() {
@Override
public void onSuccess(CustomizedArea customizedArea) {
if (customizedArea.getStatus() == 200) {
Log.d(TAG, "onSuccess: ------------请求成功---------------");
loadData.onSuccess(customizedArea);
}
}
@Override
public void onError(Throwable error, String msg) {
Log.d(TAG, "onError: ---------------请求失败------------------");
}
});
}
}
Presenterpackage com.wj.mvp.view.customizedarea.presenter;
/**
* 交互层
*/
public interface ICustomizedAreaPresenter {
void getInteractive();
}
package com.wj.mvp.view.customizedarea.presenter;
import com.wj.mvp.base.BasePresenter;
import com.wj.mvp.entity.CustomizedArea;
import com.wj.mvp.view.customizedarea.activity.ICustomizedAreaActivity;
import com.wj.mvp.view.customizedarea.model.CustomizedAreaModel;
import com.wj.mvp.view.customizedarea.model.ICustomizedAreaModel;
/**
* 交互层
*/
public class CustomizedAreaPresenter<T extends ICustomizedAreaActivity> extends BasePresenter<T>{
private CustomizedAreaModel customizedAreaModel=new CustomizedAreaModel();
public void getInteractive() {
if (mViewRef.get()!=null){
if (customizedAreaModel!=null){
customizedAreaModel.getData(new ICustomizedAreaModel.getLoadData() {
@Override
public void onSuccess(CustomizedArea customizedArea) {
mViewRef.get().showData(customizedArea);
}
@Override
public void onFail() {
}
});
}
}
}
}
View层 package com.wj.mvp.view.customizedarea.activity;
import com.wj.mvp.entity.CustomizedArea;
/**
* 定制专区
*/
public interface ICustomizedAreaActivity {
void showData(CustomizedArea customizedArea);
}
package com.wj.mvp.view.customizedarea.activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import com.wj.mvp.R;
import com.wj.mvp.adapter.CustomizedAreaWorkSharing;
import com.wj.mvp.base.BaseActivity;
import com.wj.mvp.entity.CustomizedArea;
import com.wj.mvp.view.customizedarea.presenter.CustomizedAreaPresenter;
/**
* 显示层
*/
public class CustomizedAreaActivity extends BaseActivity<ICustomizedAreaActivity, CustomizedAreaPresenter<ICustomizedAreaActivity>> implements ICustomizedAreaActivity {
private RecyclerView mRecyclerView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_customized_area);
mRecyclerView = (RecyclerView) findViewById(R.id.mRecyclerView_share);
presenter.getInteractive();
}
@Override
protected CustomizedAreaPresenter<ICustomizedAreaActivity> createPresenter() {
return new CustomizedAreaPresenter<>();
}
@Override
public void showData(CustomizedArea customizedArea) {
mRecyclerView.setAdapter(new CustomizedAreaWorkSharing(CustomizedAreaActivity.this, customizedArea.getCustom_design()));
mRecyclerView.setLayoutManager(new LinearLayoutManager(CustomizedAreaActivity.this, OrientationHelper.HORIZONTAL, false));
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView();
}
}
希望对大家有所帮助!
|