基于retrofit2+rxjava2封装的Android mvp框架

base基类 

  

public interface BaseView {
    void showLoading();
    void hideLoading();
    void loginExpired();
}
public class BasePresenter<V extends BaseView, M extends BaseMode> {
    protected V mView;
    protected M mModel;
    protected Context mContext;

    public BasePresenter(Context mContext, V mView, M mModel) {
        this.mView = mView;
        this.mModel = mModel;
        this.mContext = mContext;
    }

    public void onDestroy() {
        if (mModel != null) {
            mModel.onDestroy();
        }
    }

}
public abstract class BaseMode {


    public CompositeDisposable mDisposable = new CompositeDisposable();

    /**
     * 初始化调用网络请求
     * @return
     */
    public mvp apiService() {
        return MvpApi.createApi().create(mvp.class);
    }
    /**
     * 取消网络请求
     */
    public void onDestroy() {
        if (mDisposable != null) {
            mDisposable.dispose();
            mDisposable.clear();
        }
    }

}
public abstract class BaseActivity<T extends BasePresenter> extends RxAppCompatActivity {
    public Context mContext;
    public T mPresenter;
    private Unbinder mBind;
    public Bundle mSavedInstanceState;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSavedInstanceState = savedInstanceState;
        mContext = this;
        if (setViewId() != 0) {
            setContentView(setViewId());
        } else {
            throw new RuntimeException("layoutRes==-1");
        }
        createPresenter();
        mBind = ButterKnife.bind(this);
        EventBus.getDefault().register(this);
        initView();
    }

  EventBean 消息通知bean


public class EventBean {
    private int code;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Object getJob() {
        return job;
    }

    public void setJob(Object job) {
        this.job = job;
    }

    private Object job;

}

   登录示例 使用

 

 @FormUrlEncoded
    @POST("/xxxxxx")
    Observable<BaseBean> login(@Field("telephone") String telephone,@Field("password") String password);

  

public interface ILogin {

    interface IPLogin {
        void Login(String teltphone,String password);

    }

    interface IVLogin extends BaseView {

        void LoginSuccess(LoginBean bean);

        void LoginError(String reason);

        void refreshButton();
    }
}
public class LoginMode extends BaseMode {
    public void Login(String teltphone,String password,RxObservable rxObservable) {
        apiService()
                .login(teltphone,password)
                .compose(RxTransformerUtils.switchSchedulers(this))
                .subscribe(rxObservable);

    }

}
public class LoginPresenter extends BasePresenter<ILogin.IVLogin, LoginMode> implements ILogin.IPLogin {

    public LoginPresenter(Context mContext, ILogin.IVLogin mView) {
        super(mContext, mView, new LoginMode());
    }

    @Override
    public void Login(String teltphone, String password) {
        //网络请求前加载loading
        mView.showLoading();
        mModel.Login(teltphone, password, new RxObservable() {

            @Override
            public void onSuccess(Object o) {
                //请求返回关闭loading
                mView.hideLoading();
                mView.LoginSuccess((LoginBean) o);
            }

            @Override
            public void onFail(String reason) {
                //请求返回关闭loading
                mView.hideLoading();
                mView.LoginError(reason);
            }

            @Override
            public void onExpired() {
                //网络错误关闭loading
                mView.hideLoading();
                mView.loginExpired();
            }
        });
    }

    //监听输入
    public void textListener(final TextView view) {
        view.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before,
                                      int count) {
                mView.refreshButton();
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                                          int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });

    }
}
public class LoginActivity extends BaseActivity<LoginPresenter> implements ILogin.IVLogin {
    @BindView(R.id.et_telephone)
    AppCompatEditText etTelephone;
    @BindView(R.id.et_password)
    AppCompatEditText etPassword;
    @BindView(R.id.btn_next)
    Button btnNext;

    @Override
    public void initView() {
        //监听输入
        mPresenter.textListener(etTelephone);
        mPresenter.textListener(etPassword);
    }

    @Override
    public int setViewId() {
        return R.layout.activity_login;
    }

    @Override
    public void createPresenter() {
        mPresenter = new LoginPresenter(this, this);
    }

    @Override
    public void LoginSuccess(LoginBean bean) {
        //登录成功
    }

    @Override
    public void LoginError(String reason) {
        //登录失败
        showToast(reason);
    }

    @Override
    public void refreshButton() {
        //判断按钮是否可以点击
    }

    @Override
    public void showLoading() {
        //加载loading
    }

    @Override
    public void hideLoading() {
        //关闭loading
    }

    @Override
    public void loginExpired() {
        //登录失效处理
    }


    @OnClick(R.id.btn_next)
    public void onViewClicked() {
        //判断符合条件请求登录
        if (!StringUtils.IsStringNull(etTelephone.getText().toString()) && !StringUtils.IsStringNull(etPassword.getText().toString())) {
            mPresenter.Login(etTelephone.getText().toString(), etPassword.getText().toString());
        }
    }

    //可以重写接受eventbus通知的方法.
    @Override
    protected void acceptMessage(int code, Object object) {
        super.acceptMessage(code, object);
    }
}

 完整demo https://github.com/cheerrich/retrofit2-rxjava-2-android-mvp-.git

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值