android MVP+retrofit模式例子

匿名 (未验证) 提交于 2019-12-03 00:22:01

MVP 特点

MVP 模式将Activity 中的业务逻辑全部分离出来,让Activity 只做 UI 逻辑的处理,所有跟Android API无关的业务逻辑由 Presenter 层来完成。

将业务处理分离出来后最明显的好处就是管理方便,但是缺点就是增加了代码量。

MVP 理论知识

在MVP 架构中跟MVC类似的是同样也分为三层。

Activity 和Fragment 视为View层,负责处理 UI。

Presenter 为业务处理层,既能调用UI逻辑,又能请求数据,该层为纯Java类,不涉及任何Android API。

Model 层中包含着具体的数据请求,数据源。

一张图看关系:


例子:

/**  * 接口封装类  */ public class LoginContract {     // view层接口     public interface LoginView  {         public void onLoadSuccess(LoginResult result);         public void onLoadFailed(String msg);                }     // model层接口     public interface LoginModel {         void getLoginData(LoginRequest loginRequest, LoginOnLoadListener listener);     }     // presenter层接口     public interface LoginPresenter {         void getData(LoginRequest loginRequest);     }     // callback     public interface LoginOnLoadListener {         public void onSuccess(LoginResult result);         public void onFailure(String msg);     } }

model类:

public class LoginModel implements LoginContract.LoginModle {      @Override     public void getLoginData(LoginRequest loginRequest, final LoginContract.LoginOnLoadListener listener) { 	// model用来访问网络         ApiRetrofit.getInstance().login(loginRequest)                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .subscribe(new Subscriber <LoginResult> () {                     @Override                     public void onCompleted() {                      }                      @Override                     public void onError(Throwable e) {                         listener.onFailure(e.getMessage());                     }                      @Override                     public void onNext(LoginResult loginResult) {                         listener.onSuccess(loginResult);                     }                 });     } }

presenter类:

public class LoginPresenter implements LoginContract.Presenter {     private LoginModel model;     private LoginView mView;      public LoginPresenter(LoginView view) {         this.mView=view         model=new LoginModel();     }      @Override     public void getDataFromNet(LoginRequest loginRequest) { 	//将model层获取的数据传入到view层         model.getLoginData(loginRequest, new LoginContract.LoginOnLoadListener() {             @Override             public void onSuccess(LoginResult result) {                 mView.onLoadSuccess(result);             }              @Override             public void onFailure(String e) {                 mView.onLoadFail(e);             }          });     } }

view:

public class LoginActivity extends BaseActivity implements LoginContract.View {      @Bind(R.id.bt_login)     Button btLogin;     private LoginPresenter mPresenter;     ...      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         // TODO: add setContentView(...) invocation         ButterKnife.bind(this); 	mPresenter = new LoginPresenter(this); 	btLogin.setOnClickListener(v -> mPresenter.getDataFromNet(new LoginRequest()););     }          ...      @Override     public void onLoadFail(String msg) {        LogUtils.i(TAG,msg);        ...     }      @Override     public void onLoadSuccess(LoginResult result) {         LogUtils.i(TAG,result.toString());         ...     } }







标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!