Android Mvp 架构
MVP(Model-View-Presenter)模式:
- Model: 數據層. 負責與網絡層和數據庫層的邏輯交互.
- View: UI層. 顯示數據, 并向Presenter報告用戶行為.
- Presenter: 從Model拿數據, 應用到UI層, 管理UI的狀態, 決定要顯示什么, 響應用戶的行為.
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MVP 模式
登錄的栗子:
? ?
在此栗子中
M? :對應的是LoginModel ,實現了Model中接口中的 login(String username, String password) 方法,將username、password放在聯網請求中,進行請求服務器。
V : 對應的是LoginActivity, 繼承了封裝的activity基類,實現 MainContract.View中的方法 ,在實現的方法中,進行進度條加載、和登陸成功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 帳號*/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, "帳號密碼不能為空", Toast.LENGTH_SHORT).show();return;}mPresenter.login(getUsername(), getPassword());} }? P: 對應的是LoginPresenter,繼承了自定義Presenter基類,實現MainContract.Presenter 接口中的 login(String username, String password) 方法實例化Model,在MainPresenter login(String username, String password)方法中,調用model的網絡請求,將username、password放在model的login()方法中,進行請求服務器。
請求服務器前 使用MainContract.View中的 mView.showLoading()方法,進行顯示加載中;在成功失敗的回調中,使用對應的方法,以及取消加載。
?Model,View,Presenter接口統一由 MainContract來管理
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);}?各個封裝基類如下:
BasePresenter 類, public class BasePresenter<V extends BaseView> {protected V mView;/*** 綁定view,一般在初始化中調用該方法** @param view view*/public void attachView(V view) {this.mView = view;}/*** 解除綁定view,一般在onDestroy中調用*/public void detachView() {this.mView = null;}/*** View是否綁定** @return*/public boolean isViewAttached() {return mView != null;}}BaseVIew 類
public interface BaseView {/*** 顯示加載中*/void showLoading();/*** 隱藏加載*/void hideLoading();/*** 數據獲取失敗* @param throwable*/void onError(Throwable throwable);/*** 綁定Android生命周期 防止RxJava內存泄漏** @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內存泄漏** @param <T>* @return*/@Overridepublic <T> AutoDisposeConverter<T> bindAutoDispose() {return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this, Lifecycle.Event.ON_DESTROY));} }?
總結: 實現步驟(以登錄為例子)
? ? 1.創建登錄Contract: LoginContract, 用于統一管理mvp接口
? ? 2.創建mvp類并實現上面創建的接口
??
? ?
public class LoginActivity extends BaseMvpActivity<LoginPresenter> implements MainContract.View public class LoginModel implements MainContract.Modelpublic class LoginPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Android Mvp 架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serious Python
- 下一篇: Android实现下拉头部缩放功能