Android Mvp 架构
MVP(Model-View-Presenter)模式:
- Model: 數(shù)據(jù)層. 負(fù)責(zé)與網(wǎng)絡(luò)層和數(shù)據(jù)庫(kù)層的邏輯交互.
- View: UI層. 顯示數(shù)據(jù), 并向Presenter報(bào)告用戶行為.
- Presenter: 從Model拿數(shù)據(jù), 應(yīng)用到UI層, 管理UI的狀態(tài), 決定要顯示什么, 響應(yīng)用戶的行為.
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MVP 模式
登錄的栗子:
? ?
在此栗子中
M? :對(duì)應(yīng)的是LoginModel ,實(shí)現(xiàn)了Model中接口中的 login(String username, String password) 方法,將username、password放在聯(lián)網(wǎng)請(qǐng)求中,進(jìn)行請(qǐng)求服務(wù)器。
V : 對(duì)應(yīng)的是LoginActivity, 繼承了封裝的activity基類,實(shí)現(xiàn) MainContract.View中的方法 ,在實(shí)現(xiàn)的方法中,進(jìn)行進(jìn)度條加載、和登陸成功or失敗的UI的展示:
public class LoginActivity extends BaseMvpActivity<LoginPresenter> implements MainContract.View {@BindView(R.id.et_username_login)TextInputEditText etUsernameLogin;@BindView(R.id.et_password_login)TextInputEditText etPasswordLogin;@Overridepublic int getLayoutId() {return R.layout.activity_main;}@Overridepublic void initView() {mPresenter = new LoginPresenter();mPresenter.attachView(this);}/*** @return 帳號(hào)*/private String getUsername() {return etUsernameLogin.getText().toString().trim();}/*** @return 密碼*/private String getPassword() {return etPasswordLogin.getText().toString().trim();}@Overridepublic void onSuccess(BaseObjectBean bean) {Toast.makeText(this, bean.getErrorMsg(), Toast.LENGTH_SHORT).show();}@Overridepublic void showLoading() {ProgressDialog.getInstance().show(this);}@Overridepublic void hideLoading() {ProgressDialog.getInstance().dismiss();}@Overridepublic void onError(Throwable throwable) {}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ButterKnife.bind(this);}@OnClick(R.id.btn_signin_login)public void onViewClicked() {if (getUsername().isEmpty() || getPassword().isEmpty()) {Toast.makeText(this, "帳號(hào)密碼不能為空", Toast.LENGTH_SHORT).show();return;}mPresenter.login(getUsername(), getPassword());} }? P: 對(duì)應(yīng)的是LoginPresenter,繼承了自定義Presenter基類,實(shí)現(xiàn)MainContract.Presenter 接口中的 login(String username, String password) 方法實(shí)例化Model,在MainPresenter login(String username, String password)方法中,調(diào)用model的網(wǎng)絡(luò)請(qǐng)求,將username、password放在model的login()方法中,進(jìn)行請(qǐng)求服務(wù)器。
請(qǐng)求服務(wù)器前 使用MainContract.View中的 mView.showLoading()方法,進(jìn)行顯示加載中;在成功失敗的回調(diào)中,使用對(duì)應(yīng)的方法,以及取消加載。
?Model,View,Presenter接口統(tǒng)一由 MainContract來(lái)管理
public interface MainContract {interface Model {Flowable<BaseObjectBean<LoginBean>> login(String username, String password);}interface View extends BaseView {@Overridevoid showLoading();@Overridevoid hideLoading();@Overridevoid onError(Throwable throwable);void onSuccess(BaseObjectBean<LoginBean> bean);}interface Presenter {/*** 登陸** @param username* @param password*/void login(String username, String password);}?各個(gè)封裝基類如下:
BasePresenter 類, public class BasePresenter<V extends BaseView> {protected V mView;/*** 綁定view,一般在初始化中調(diào)用該方法** @param view view*/public void attachView(V view) {this.mView = view;}/*** 解除綁定view,一般在onDestroy中調(diào)用*/public void detachView() {this.mView = null;}/*** View是否綁定** @return*/public boolean isViewAttached() {return mView != null;}}BaseVIew 類
public interface BaseView {/*** 顯示加載中*/void showLoading();/*** 隱藏加載*/void hideLoading();/*** 數(shù)據(jù)獲取失敗* @param throwable*/void onError(Throwable throwable);/*** 綁定Android生命周期 防止RxJava內(nèi)存泄漏** @param <T>* @return*/<T> AutoDisposeConverter<T> bindAutoDispose();}BaseMvpActivity 類
public abstract class BaseMvpActivity<T extends BasePresenter> extends BaseActivity implements BaseView {protected T mPresenter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overrideprotected void onDestroy() {if (mPresenter != null) {mPresenter.detachView();}super.onDestroy();}/*** 綁定生命周期 防止MVP內(nèi)存泄漏** @param <T>* @return*/@Overridepublic <T> AutoDisposeConverter<T> bindAutoDispose() {return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY));} }?
總結(jié): 實(shí)現(xiàn)步驟(以登錄為例子)
? ? 1.創(chuàng)建登錄Contract: LoginContract, 用于統(tǒng)一管理mvp接口
? ? 2.創(chuàng)建mvp類并實(shí)現(xiàn)上面創(chuàng)建的接口
??
? ?
public class LoginActivity extends BaseMvpActivity<LoginPresenter> implements MainContract.View public class LoginModel implements MainContract.Modelpublic class LoginPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Android Mvp 架构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Serious Python
- 下一篇: Android实现下拉头部缩放功能