在2015年时rxjava特别火,项目的一个搭档就建议使用了mvp+rxjava+Retrofit框架,当时看的是一脸惆怅,因为搭档封装的特别多,也特别复杂所以就特别抵触,最后也是要跟进项目硬着头皮学习rxjava相关知识。但是总感觉没有Mvc架构的写的溜,最后由于某些原因就在没有使用此技术。
最近项目使用了mvp+rxjava+Retrofit的知识,那我就谈谈:
1.首先mvp架构的架构组成由modele,presenter和view组成,Presenter是model和view的桥梁关系,两者之间的交互必须经过presenter层,presenter中是代码逻辑处理层,view只负责拿到数据展示而已,model层是数据那就必须提供数据,数据来自于网络,所以model也做网络请求数据,也就是Rxjava+retrofit的功能部分。通过在presenter回调到数据给view进行展示
public class AccountLoginFragment extends BaseNoPagerFragment implements View.OnClickListener, LoginContracts.LoginView { private EditText editAccout; private EditText editPassWord; private Button login; private Button quickLogin; AutoLoginPresenter loginPwdPresenter; private String value; private ImageView ivEye; private boolean isOpen = true; @Override protected void initToolBar(ShiKeToolBar toolbarRootFgNoPager) { toolbarRootFgNoPager.setTitle("登陆"); } @Override protected void initPresenters(ArrayList<IBasePresenter> basePresenters) { basePresenters.add(loginPwdPresenter); } //调用 @Override protected void initData() { loginPwdPresenter = new AutoLoginPresenter(this); loginPwdPresenter.autoLogin(); } //modele请求数据成功数据交给presenter然后后回调方法用于展示 @Override public void onLoginSuccess(String success) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } LoginBean loginBean = new Gson().fromJson(success, LoginBean.class); } //modele请求数据失败数据交给presenter然后后回调方法用于展示 @Override public void onErrorLogin(String error) { showToast("网络错误"): } //请求网络用到的参数回调到presenter层,交给model请求网络 @Override public Map<String, String> loadLoginInfo() { Map<String, String> map = new HashMap<>(); value = editAccout.getText().toString().trim(); map.put("username", value); map.put("password", editPassWord.getText().toString().trim()); return map; } } perstener层逻辑 public class AutoLoginPresenter extends LoginContracts.IPresenter { public AutoLoginPresenter(LoginContracts.LoginView view) { super(view); model = new LoginModel(); } @Override public void autoLogin() { Subscription subscribe = model.autoLogin(aesCode(view.loadLoginInfo())) .retryWhen(new RetryFunc1()) .subscribe(new BaseSubscriber<String>(view) { @Override public void onNextStep(String step) { view.onLoginSuccess(step); } @Override public void onError(Throwable e) { view.onErrorLogin(e.getMessage()); } }); addSubscription(subscribe); } } //model层逻辑 public class LoginModel implements LoginContracts.IModel { @Override public Observable<String> autoLogin(String login) { return RetrofitManager.getInstance().getCommonApi().autoLogin(login); } } /** * Created by tyranny on 2017/8/16 14:59. * * @version 1.0.0 */ public class LoginContracts { public interface LoginView extends IBaseView { Map<String, String> loadLoginInfo(); void onLoginSuccess(String success); void onErrorLogin(String error); } public interface IModel extends IBaseModel { Observable<String> autoLogin(String login); Observable<String> loginForPhone(String login); Observable<String> loginForPwd(String login); } public abstract static class IPresenter extends IBasePresenter<LoginView, IModel> { public IPresenter(LoginView view) { super(view); } public abstract void autoLogin(); public abstract void phoneLogin(); public abstract void pwdLogin(); } }