zoukankan      html  css  js  c++  java
  • Android MVP 构架封装

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

    源码地址RxMVP分支Tag03

    最终实现目录结构如下

    BasePresenter

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

    public abstract class BasePresenter<T> {
        public T mView;
    
        public void attach(T mView){
            this.mView = mView;
        }
    
        public void dettach(){
            mView = null;
        }
    }
    

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

    public class NewMvpPresenter extends BasePresenter<NewMvpView> {
            private RequestBiz requestBiz;
            private Handler mHandler;
    
            public NewMvpPresenter() {        
                requestBiz = new RequestBizIml();
                mHandler = new Handler(Looper.getMainLooper());
            }    
    
            public void onResume(){        
                requestBiz.requestForData(new OnRequestListener() {
                    @Override            
                    public void onSuccess(final List<String> data) {
                        //由于请求开启了新线程,所以用handler去更新界面
                        mHandler.post(new Runnable() {                    
                          @Override                    
                           public void run() {                        
                               mView.hideLoading();                        
                               mView.setListItem(data);                    
                            }                
                        });            
                     }            
    
                     @Override            
                     public void onFailed() {                
                         mView.showMessage("请求失败");            
                     }        
                });    
           }   
    
            public void onItemClick(int position){        
                  mView.showMessage("点击了item"+position);     
            }
    }
    

    BaseView

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

    public interface BaseView {
        void showLoading();
        void hideLoading();
    }
    

    BaseMvpActivity

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

    public abstract class BaseMvpActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {
    
        public T presenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            presenter = initPresenter();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            presenter.attach((V)this);
        }
    
        @Override
        protected void onDestroy() {
            presenter.dettach();
            super.onDestroy();
        }
    
        public abstract T initPresenter();
    
    }
    
    

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

    基于BaseMVP的栗子

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

    NewMvpView

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

    NewMvpPresenter

    • NewMvpPresenter 继承BasePresenter类,增加网络请求和处理点击事件的方法
    public class NewMvpPresenter extends BasePresenter<NewMvpView> {
            private RequestBiz requestBiz;
            private Handler mHandler;
    
            public NewMvpPresenter() {        
                requestBiz = new RequestBizIml();
                mHandler = new Handler(Looper.getMainLooper());
            }    
    
            public void onResume(){     
                mView.showLoading();   
                requestBiz.requestForData(new OnRequestListener() {
                    @Override            
                    public void onSuccess(final List<String> data) {
                        //由于请求开启了新线程,所以用handler去更新界面
                        mHandler.post(new Runnable() {
                          @Override                    
                           public void run() {                        
                               mView.hideLoading();                        
                               mView.setListItem(data);                    
                            }                
                        });            
                     }            
    
                     @Override            
                     public void onFailed() {                
                         mView.showMessage("请求失败");            
                     }        
                });    
           }   
    
            public void onItemClick(int position){        
                  mView.showMessage("点击了item"+position);     
            }
    }
    
    • NewMvpActivity 最终的样子
    public class NewMvpActivity extends BaseMvpActivity<NewMvpView, NewMvpPresenter> implements NewMvpView, AdapterView.OnItemClickListener {
        @BindView(R.id.mvp_listview)
        ListView mvpListView;
    
        MvpPresenter mvpPresenter;
        SweetAlertDialog pd;
        Context mContext;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = this;
            ButterKnife.bind(this);
            mvpListView.setOnItemClickListener(this);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            presenter.onResume();
        }
    
        @Override
        public NewMvpPresenter initPresenter() {
            return new NewMvpPresenter();
        }
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            presenter.onItemClick(position);
        }
    
        @Override
        public void setListItem(List<String> data) {
            ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data);
            mvpListView.setAdapter(adapter);
        }
    
        @Override
        public void showMessage(String message) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void showLoading() {
            if (pd == null) {
                pd = new SweetAlertDialog(mContext, SweetAlertDialog.PROGRESS_TYPE);
                pd.getProgressHelper().setBarColor(Color.parseColor("#A5DC86"));
                pd.setTitleText("Loading");
                pd.setCancelable(true);
            }
            pd.show();
        }
    
        @Override
        public void hideLoading() {
            pd.hide();
        }
    }
    

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

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

  • 相关阅读:
    Quartz_理解2
    Quartz_理解1
    Java监控常用工具 .
    DB2函数大全
    cvs上传复制项目
    PLSQL DEVELOPER 使用的一些技巧【转】
    webservice_模拟报文测试
    Myeclipse插件将wsdl生成java客户端代码
    利用 UltraEdit 重新排版 XML 结构数据
    uoj164. 【清华集训2015】V 统计
  • 原文地址:https://www.cnblogs.com/zyw-205520/p/5813698.html
Copyright © 2011-2022 走看看