Android MVP架构简析

参考:Android MVP 架构 - 简书

MVP优点:1.代码简洁
            2.降低耦合,方便维护

MVP的使用使activity中的网络请求剥离出来,成为model、presenter。
model只负责网络请求,presenter负责处理请求网络后的数据处理:加载中 成功 失败 取消加载等,最后view进行界面的展示    

MVP在实现代码简洁的同时,额外增加了大量的接口、类,不方便进行管理,于是Contract就登场了
Contract 契约、协议,主要是用于将model、presenter、view进行约束管理,方便后期类的查找维护。

下面是自己总结的伪代码:

在contract中定义MVP的接口:

public interface Contract{
		interface Model{
			//例如一个登录方法 随便写的几个登录参数
			void setLogin(String phone,String pwd,String loginBean,ApiCallBackcallback)
		}

		interface View{
			void LoginSuccess(LoginBean loginBean)
			void LoginFail(String errMsg)
		}


		interface Presenter{
			void setLogin(String phone,String pwd)
		}
	}


在model中请求网络数据:

public class Model implements Contract.Model{
		//实现contract中的model中的方法
		@SuppressLint("CheckResult")
		@Override
		public void setLogin(String phone,String pwd,String loginBean,final ApiCallBackcallback){
		//进行网络请求
		ApiUtils.getApi().login(phone,pwd)
		 .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer>() {
                    @Override
                    public void accept(ResponseBean loginBeanResponseBean) throws Exception {
                        callBack.onResponse(loginBeanResponseBean);
                    }
                }, new Consumer() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        callBack.onFailure(throwable);
                    }
                });
		}
	}


在presenter中处理请求网络后的数据:

public class Presenter extends BasePresenter implements Contract.Presenter{
		private Model model;
		
		//重写一个构造方法
		public Presenter(Contract.View view){
			super(view);
			model =new Model();
		}

		@Override
		    public void setLogin(String phone,String pwd){
			LoginBean loginBean = new LoginBean();
			loginBean.setPhone(phone);
     			loginBean.setPassword(pwd);
			String loginjson;
			Gson gson=new Gson();
			loginjson=gson.toJson(loginBean);


        model.setLogin(  phone,  loginjson, new ApiCallBack() {
            @Override
            protected void onSuccess(LoginBean responseData, String message) {
                if (getView() != null) {
                    getView().LoginSuccess(responseData);
                }
            }

            @Override
            protected void onFailure(String error) {
                if (getView() != null) {
                    getView().LoginFail(error);
                }
            }
        });

	
		}

	}

在View中展示界面:

public class View implement Contract.View{
		private Presenter mPresenter;
		
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


       //在初始化方法中实例化这个presenter
		mPresenter = new Presenter(this);
        
        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //然后在登录按钮的点击方法中调用
		        mPresenter.setLogin(phone,pwd)
            }
        });

		

    }
		




		//最后再实现Contract中View中的方法

    @Override
    public void LoginSuccess(LoginBean loginBean) {
       //做登录成功的操作 记录个人信息 跳转主页等
    }



    @Override
    public void LoginFail(String errMsg) {
      //提示用户错误信息 toast或者dialog形式
    }

	}

BasePresenter是对Presenter的封装:
 



import java.lang.ref.WeakReference;


public class BasePresenter {
    private WeakReference mViewWeakReference;

    public BasePresenter(View view) {
        mViewWeakReference = new WeakReference<>(view);
    }

    public void detach() {
        if (mViewWeakReference != null) {
            mViewWeakReference.clear();
            mViewWeakReference = null;
        }
    }

    public View getView() {
        return mViewWeakReference == null ? null : mViewWeakReference.get();
    }

}

你可能感兴趣的:(android,架构,java,MVP架构)