上一篇我们简单实现了一个MVP的构架,下面我们来做一个简单的封装使其使用更简单方便

源码地址RxMVP分支Tag03

最终实现目录结构如下

BasePresenter

如果每一个Activity都需要做绑定和解绑操作就太麻烦了,现在我希望可以有一个通用的presenter来为我们添加view的绑定与销毁。

  1. public abstract class BasePresenter<T> {
  2. public T mView;
  3. public void attach(T mView){
  4. this.mView = mView;
  5. }
  6. public void dettach(){
  7. mView = null;
  8. }
  9. }

因为不能限定死传入的View,所以使用泛型来代替传入的对象。通过这个通用的presenter我就可以把原来的MvpPresenter简化成下面的样子

  1. public class NewMvpPresenter extends BasePresenter<NewMvpView> {
  2. private RequestBiz requestBiz;
  3. private Handler mHandler;
  4. public NewMvpPresenter() {
  5. requestBiz = new RequestBizIml();
  6. mHandler = new Handler(Looper.getMainLooper());
  7. }
  8. public void onResume(){
  9. requestBiz.requestForData(new OnRequestListener() {
  10. @Override
  11. public void onSuccess(final List<String> data) {
  12. //由于请求开启了新线程,所以用handler去更新界面
  13. mHandler.post(new Runnable() {
  14. @Override
  15. public void run() {
  16. mView.hideLoading();
  17. mView.setListItem(data);
  18. }
  19. });
  20. }
  21. @Override
  22. public void onFailed() {
  23. mView.showMessage("请求失败");
  24. }
  25. });
  26. }
  27. public void onItemClick(int position){
  28. mView.showMessage("点击了item"+position);
  29. }
  30. }

BaseView

界面需要提供的UI方法中会有很多类似的UI方法,可以把它们提取到一个公共的父类接口中。比如提取显示loading界面和隐藏loading界面的方法,其他的view层接口就可以直接继承BaseView接口,不必重复的写显示和隐藏loading界面方法。

  1. public interface BaseView {
  2. void showLoading();
  3. void hideLoading();
  4. }

BaseMvpActivity

presenter绑定到activity和View的绑定和解绑操作是每个Activity都会去做的,同样这里我也希望能有一个父类来完成这个统一的操作。

  1. public abstract class BaseMvpActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {
  2. public T presenter;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. presenter = initPresenter();
  7. }
  8. @Override
  9. protected void onResume() {
  10. super.onResume();
  11. presenter.attach((V)this);
  12. }
  13. @Override
  14. protected void onDestroy() {
  15. presenter.dettach();
  16. super.onDestroy();
  17. }
  18. public abstract T initPresenter();
  19. }

同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个 initPresenter(); 方法用来初始化presenter,如果想创建不同参数的构造函数都可以随意去创建。

基于BaseMVP的栗子

通过上面的base父类,对之前的例子进行优化,写一个更加好用的例子。

NewMvpView

  • NewMvpView 继承BaseView接口,添加自己的初始化ListView和Toast信息方法
  1. public interface NewMvpView extends BaseView {
  2. void setListItem(List<String> data);
  3. void showMessage(String message);
  4. }

NewMvpPresenter

  • NewMvpPresenter 继承BasePresenter类,增加网络请求和处理点击事件的方法
  1. public class NewMvpPresenter extends BasePresenter<NewMvpView> {
  2. private RequestBiz requestBiz;
  3. private Handler mHandler;
  4. public NewMvpPresenter() {
  5. requestBiz = new RequestBizIml();
  6. mHandler = new Handler(Looper.getMainLooper());
  7. }
  8. public void onResume(){
  9. mView.showLoading();
  10. requestBiz.requestForData(new OnRequestListener() {
  11. @Override
  12. public void onSuccess(final List<String> data) {
  13. //由于请求开启了新线程,所以用handler去更新界面
  14. mHandler.post(new Runnable() {
  15. @Override
  16. public void run() {
  17. mView.hideLoading();
  18. mView.setListItem(data);
  19. }
  20. });
  21. }
  22. @Override
  23. public void onFailed() {
  24. mView.showMessage("请求失败");
  25. }
  26. });
  27. }
  28. public void onItemClick(int position){
  29. mView.showMessage("点击了item"+position);
  30. }
  31. }
  • NewMvpActivity 最终的样子
  1. public class NewMvpActivity extends BaseMvpActivity<NewMvpView, NewMvpPresenter> implements NewMvpView, AdapterView.OnItemClickListener {
  2. @BindView(R.id.mvp_listview)
  3. ListView mvpListView;
  4. MvpPresenter mvpPresenter;
  5. SweetAlertDialog pd;
  6. Context mContext;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. mContext = this;
  12. ButterKnife.bind(this);
  13. mvpListView.setOnItemClickListener(this);
  14. }
  15. @Override
  16. protected void onResume() {
  17. super.onResume();
  18. presenter.onResume();
  19. }
  20. @Override
  21. public NewMvpPresenter initPresenter() {
  22. return new NewMvpPresenter();
  23. }
  24. @Override
  25. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  26. presenter.onItemClick(position);
  27. }
  28. @Override
  29. public void setListItem(List<String> data) {
  30. ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
  31. mvpListView.setAdapter(adapter);
  32. }
  33. @Override
  34. public void showMessage(String message) {
  35. Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
  36. }
  37. @Override
  38. public void showLoading() {
  39. if (pd == null) {
  40. pd = new SweetAlertDialog(mContext, SweetAlertDialog.PROGRESS_TYPE);
  41. pd.getProgressHelper().setBarColor(Color.parseColor("#A5DC86"));
  42. pd.setTitleText("Loading");
  43. pd.setCancelable(true);
  44. }
  45. pd.show();
  46. }
  47. @Override
  48. public void hideLoading() {
  49. pd.hide();
  50. }
  51. }

源码地址:https://github.com/Javen205/RxMVP 欢饮Start

转载:http://blog.csdn.net/dantestones/article/details/51445208

Android MVP 构架封装的更多相关文章

  1. Android MVP 构架初试

    目前讨论MVP MVVM 的架构也来越多,这种构架也很适合Android.研究MVP记录如下 源码地址RxMVP分支Tag02 原有的MVC构架 刚开始接触Android的时候会觉得Android的整 ...

  2. 结合实例分析Android MVP的实现

    最近阅读项目的源码,发现项目中有MVP的痕迹,但是自己却不能很好地理解相关的代码实现逻辑.主要原因是自己对于MVP的理解过于概念话,还没有真正操作过.本文打算分析一个MVP的简单实例,帮助自己更好的理 ...

  3. 基于Retrofit2.0+RxJava+Dragger2实现不一样的Android网络构架搭建(转载)

    转载请注明出处:http://blog.csdn.net/finddreams/article/details/50849385#0-qzone-1-61707-d020d2d2a4e8d1a374a ...

  4. MVP之高级MVP架构封装

    MVP之高级MVP架构封装 No MVP: 我们一般会这样写: public class MainActivity extends AppCompatActivity { private EditTe ...

  5. android mvp高速开发框架介绍(继续dileber)

    android mvp框架:dileber(https://github.com/dileber/dileber.git) 继续为大家介绍android mvp开源框架 dileber 官方交流qq群 ...

  6. android mvp高速开发框架介绍(dileber的简单介绍)

    今天我为大家介绍一款android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443726 我个人qq:2971 ...

  7. android mvp高速开发框架介绍(dileber使用之小工具使用)

    android mvp框架:dileber(https://github.com/dileber/dileber.git) 继续为大家介绍android mvp开源框架 dileber 官方交流qq群 ...

  8. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...

  9. [Android]Android MVP&依赖注入&单元测试

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...

随机推荐

  1. hdu 5248 贪心

    题意:

  2. hdu 2266 dfs

    题意:在数字之间添加运算符号,使得结果等于题目中要求的Sample Input123456789 321 1Sample Output181 这题虽然看起来比较简单,但是之前和差的状态不太好表示,因此 ...

  3. poj 1328 Radar Installation 排序贪心

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 56702   Accepted: 12 ...

  4. HDU 5154 Harry and Magical Computer bfs

    Harry and Magical Computer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  5. MySQL命令行工具各功能说明(转)

    MySQL 服务器端使用工具程序 mysqld - SQL 后台程序(即 MySQL 服务器进程).该程序必须启动运行,才能连接服务器来访问数据库. mysqld_safe - 服务器启动脚本,可以通 ...

  6. BZOJ2831(小强的金字塔系列问题--区域整点数求法)

    题目:2831: 小强的金字塔 题意就是给出A,B,C,R,L,然后求 这里其实用到扩展欧几里德.(基本上参照clj的解题报告才理解的) 分析:我们先来分析一般情况: 这里我们假设A<C和B&l ...

  7. [INSTALL_FAILED_OLDER_SDK]错误

    在写完Demo后,执行时发现控制台打印出这么一段话:[INSTALL_FAILED_OLDER_SDK]错误. 原因是由于:測试机或者我们所用的虚拟机的android版本号太低. defaultCon ...

  8. 开启PowerDesigner15工具栏上的被禁用掉的图标

    PowerDesigner 15 的版本,工具栏上的Inheritance图标默认是禁用的,如下图所示:

  9. Android Binder分析二:Natvie Service的注冊

    这一章我们通过MediaPlayerService的注冊来说明怎样在Native层通过binder向ServiceManager注冊一个service,以及client怎样通过binder向Servi ...

  10. C#程序集系列09,程序集签名

    在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程 ...