日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Mvp 架构

發布時間:2025/4/16 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()方法,進行顯示加載中;在成功失敗的回調中,使用對應的方法,以及取消加載。

public class LoginPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter {private MainContract.Model model;public LoginPresenter() {model = new LoginModel();}@Overridepublic void login(String username, String password) {//View是否綁定 如果沒有綁定,就不執行網絡請求if (!isViewAttached()) {return;}mView.showLoading();model.login(username, password).compose(RxScheduler.<BaseObjectBean<LoginBean>>Flo_io_main()).as(mView.<BaseObjectBean<LoginBean>>bindAutoDispose()).subscribe(new Consumer<BaseObjectBean<LoginBean>>() {@Overridepublic void accept(BaseObjectBean<LoginBean> bean) throws Exception {mView.onSuccess(bean);mView.hideLoading();}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {mView.onError(throwable);mView.hideLoading();}});} }

?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 架构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。