Mvp模式控制界面組件可用,android 應用模式之mvp

 2023-11-22 阅读 23 评论 0

摘要:說到MVP就不得不提到MVC,做過J2EE的猿友們肯定知道MVC是個什么東西。MVC即 Model、View、Controller, 那MVP就Model、View、Presenter。Model用于提供數據模型,View用于顯示數據,當然Presenter也就用來處理業務邏輯并將數據顯示數據到View上了&#

說到MVP就不得不提到MVC,做過J2EE的猿友們肯定知道MVC是個什么東西。MVC即 Model、View、Controller, 那MVP就Model、View、Presenter。Model用于提供數據模型,View用于顯示數據,當然Presenter也就用來處理業務邏輯并將數據顯示數據到View上了,它是Model和View的橋梁。

題外話,其實在15年的時候,我們公司的項目就采用mvp,當時沒時間寫,最近看時間不緊,就分享下

我將整個項目分為三個Module,如下圖

? ? ?

其實這種結構我是不太喜歡的,我喜歡在app的根目錄下,新建一個liabary文件,這里放第三方的庫工程;

一、數據處理模塊domain(包含Model),這里的domain命名只是我喜歡這樣把數據處理相關的東西都放在這里。

? ? ??

? ? ? ServiceManager用于向外提供數據的入口(其他類代碼在前面博文中已提及)

[java]?view plain?copy
  1. package?com.micky.retrofitrxandroiddragger2.domain.service;??
  2. ??
  3. import?retrofit.GsonConverterFactory;??
  4. import?retrofit.Retrofit;??
  5. import?retrofit.RxJavaCallAdapterFactory;??
  6. ??
  7. ?
  8. public?class?ServiceManager?{??
  9. ????private?static?final?String?ENDPOINT?=?"http://ip.taobao.com";??
  10. ??
  11. ????private?static?class?ServiceManagerHolder?{??
  12. ????????private?static?final?ServiceManager?INSTANCE?=?new?ServiceManager();??
  13. ????}??
  14. ??
  15. ????private?ServiceManager()?{}??
  16. ??
  17. ????public?static?final?ServiceManager?getInstance()?{??
  18. ????????return?ServiceManagerHolder.INSTANCE;??
  19. ????}??
  20. ??
  21. ????private?ApiService?mApiService?=?null;??
  22. ??
  23. ????public?ApiService?getApiService()?{??
  24. ????????if?(mApiService?==?null)?{??
  25. ????????????Retrofit?retrofit?=?new?Retrofit.Builder()??
  26. ????????????????????.baseUrl(ENDPOINT)??
  27. ????????????????????.addConverterFactory(GsonConverterFactory.create())??
  28. ????????????????????.addCallAdapterFactory(RxJavaCallAdapterFactory.create())??
  29. ????????????????????.build();??
  30. ????????????mApiService?=?retrofit.create(ApiService.class);??
  31. ????????????return?mApiService;??
  32. ????????}??
  33. ????????return?mApiService;??
  34. ????}??
  35. }??
注:我們在這個manager里面主要做一些網絡請求,業務處理,數據組裝...

二、View和Presenter模塊

? ? ? 為了方便管理我將View和Presenter相關類都放在Presentation模塊中


?

View接口

[java]?view plain?copy

  1. public?interface?MainView?{??
  2. ????void?showProgress();??
  3. ????void?hideProgress();??
  4. ????void?setIpText(String?text);??
  5. }??

Presenter接口

[java]?view plain?copy
  1. package?com.micky.retrofitrxandroiddragger2.presenter;??
  2. ??

  3. public?interface?MainPresenter?extends?BasePresenter?{??
  4. ????void?getIpInfo(String?ip);??
  5. }??


Presenter實現類

[java]?view plain?copy
  1. package?com.micky.retrofitrxandroiddragger2.presenter.impl;??
  2. ??
  3. import?android.text.TextUtils;??
  4. import?android.util.Log;??
  5. import?android.widget.Toast;??
  6. ??
  7. import?com.micky.retrofitrxandroiddragger2.BaseApplication;??
  8. import?com.micky.retrofitrxandroiddragger2.R;??
  9. import?com.micky.retrofitrxandroiddragger2.domain.service.ServiceManager;??
  10. import?com.micky.retrofitrxandroiddragger2.domain.service.response.GetIpInfoResponse;??
  11. import?com.micky.retrofitrxandroiddragger2.presenter.MainPresenter;??
  12. import?com.micky.retrofitrxandroiddragger2.presenter.impl.BasePresenterImpl;??
  13. import?com.micky.retrofitrxandroiddragger2.ui.view.MainView;??
  14. ??
  15. import?rx.Subscriber;??
  16. import?rx.android.schedulers.AndroidSchedulers;??
  17. import?rx.schedulers.Schedulers;??
  18. ??
  19. ?
  20. public?class?MainPresenterImpl?extends?BasePresenterImpl?implements?MainPresenter?{??
  21. ????private?static?final?String?TAG?=?"TAG";??
  22. ????private?MainView?mMainView;??
  23. ??
  24. ????public?MainPresenterImpl(MainView?mainView)?{??
  25. ????????mMainView?=?mainView;??
  26. ????}??
  27. ??
  28. ????@Override??
  29. ????public?void?getIpInfo(String?ip)?{??
  30. ????????if?(TextUtils.isEmpty(ip))?{??
  31. ????????????Toast.makeText(BaseApplication.getContext(),?R.string.input_tip_ip,?Toast.LENGTH_SHORT).show();??
  32. ????????????return;??
  33. ????????}??
  34. ????????mMainView.setIpText("");??
  35. ????????mMainView.showProgress();??
  36. ????????ServiceManager.getInstance().getApiService().getIpInfo(ip)??
  37. ????????????????.subscribeOn(Schedulers.io())??
  38. ????????????????.observeOn(AndroidSchedulers.mainThread())??
  39. ????????????????.subscribe(new?Subscriber<GetIpInfoResponse>()?{??
  40. ????????????????????@Override??
  41. ????????????????????public?void?onCompleted()?{??
  42. ????????????????????????mMainView.hideProgress();??
  43. ????????????????????}??
  44. ??
  45. ????????????????????@Override??
  46. ????????????????????public?void?onError(Throwable?e)?{??
  47. ????????????????????????Log.e(TAG,?e.getMessage(),?e);??
  48. ????????????????????????mMainView.hideProgress();??
  49. ????????????????????????mMainView.setIpText(BaseApplication.getContext().getString(R.string.network_error));??
  50. ????????????????????}??
  51. ??
  52. ????????????????????@Override??
  53. ????????????????????public?void?onNext(GetIpInfoResponse?getIpInfoResponse)?{??
  54. ????????????????????????mMainView.setIpText(getIpInfoResponse.data.country?+?"?"?+?getIpInfoResponse.data.area);??
  55. ????????????????????}??
  56. ????????????????});??
  57. ????}??
  58. }??
  59. MainActivity

    [java]?view plain?copy
    1. package?com.micky.retrofitrxandroiddragger2.ui.activity;??
    2. ??
    3. import?android.os.Bundle;??
    4. import?android.support.design.widget.FloatingActionButton;??
    5. import?android.support.v7.app.AppCompatActivity;??
    6. import?android.support.v7.widget.Toolbar;??
    7. import?android.view.View;??
    8. import?android.view.Menu;??
    9. import?android.view.MenuItem;??
    10. import?android.widget.EditText;??
    11. import?android.widget.ProgressBar;??
    12. import?android.widget.TextView;??
    13. ??
    14. import?com.micky.retrofitrxandroiddragger2.R;??
    15. import?com.micky.retrofitrxandroiddragger2.presenter.MainPresenter;??
    16. import?com.micky.retrofitrxandroiddragger2.presenter.impl.MainPresenterImpl;??
    17. import?com.micky.retrofitrxandroiddragger2.ui.view.MainView;??
    18. ??

    19. public?class?MainActivity?extends?AppCompatActivity?implements?MainView?{??
    20. ??
    21. ????private?EditText?mEtIp;??
    22. ????private?TextView?mTvContent;??
    23. ????private?ProgressBar?mProgressBar;??
    24. ????private?MainPresenter?mMainPresenter;??
    25. ??
    26. ????@Override??
    27. ????protected?void?onCreate(Bundle?savedInstanceState)?{??
    28. ????????super.onCreate(savedInstanceState);??
    29. ????????setContentView(R.layout.activity_main);??
    30. ????????Toolbar?toolbar?=?(Toolbar)?findViewById(R.id.toolbar);??
    31. ????????setSupportActionBar(toolbar);??
    32. ??
    33. ????????mEtIp?=?(EditText)?findViewById(R.id.et_ip);??
    34. ????????mTvContent?=?(TextView)?findViewById(R.id.tv_content);??
    35. ????????mProgressBar?=?(ProgressBar)?findViewById(R.id.progress_bar);??
    36. ????????mMainPresenter?=?new?MainPresenterImpl(this);??
    37. ??
    38. ????????FloatingActionButton?fab?=?(FloatingActionButton)?findViewById(R.id.fab);??
    39. ????????fab.setOnClickListener(new?View.OnClickListener()?{??
    40. ????????????@Override??
    41. ????????????public?void?onClick(View?view)?{??
    42. ????????????????mMainPresenter.getIpInfo(mEtIp.getText().toString());??
    43. ????????????}??
    44. ????????});??
    45. ????}??
    46. ??
    47. ????@Override??
    48. ????public?boolean?onCreateOptionsMenu(Menu?menu)?{??
    49. ????????getMenuInflater().inflate(R.menu.menu_main,?menu);??
    50. ????????return?true;??
    51. ????}??
    52. ??
    53. ????@Override??
    54. ????public?boolean?onOptionsItemSelected(MenuItem?item)?{??
    55. ????????int?id?=?item.getItemId();??
    56. ????????if?(id?==?R.id.action_settings)?{??
    57. ????????????return?true;??
    58. ????????}??
    59. ????????return?super.onOptionsItemSelected(item);??
    60. ????}??
    61. ??
    62. ????@Override??
    63. ????public?void?showProgress()?{??
    64. ????????mProgressBar.setVisibility(View.VISIBLE);??
    65. ????}??
    66. ??
    67. ????@Override??
    68. ????public?void?hideProgress()?{??
    69. ????????mProgressBar.setVisibility(View.GONE);??
    70. ????}??
    71. ??
    72. ????@Override??
    73. ????public?void?setIpText(String?text)?{??
    74. ????????mTvContent.setText(text);??
    75. ????}??
    76. }??
    ?
    ? ? ?OK,代碼基本完了,看了上述代碼大家也許都會說以前就在一個類里面就搞定的功能,現在怎么多出這么多接口、實現類啊。別急我剛看到這個mvp的時候也這么想,幾度寫著寫著都把它拋之腦后,這類都多得看不過來了。

    ? ? 仔細研究下不難發現這M、V、P三者的關系還是挺清晰的。


    好了就到這里,你也趕快試試吧

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/184525.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息