美文网首页
也许是对Android MVP讲解的最清楚的

也许是对Android MVP讲解的最清楚的

作者: 起个名字真难999 | 来源:发表于2017-11-23 14:40 被阅读19次

    一千个人心中有一千个哈姆雷特,各人对相同东西的理解层次各不相同,但他们又是殊途同归,网上也看了很多别人理解的mvp,而且mvp也出现了很久,但我们自己的项目却没有用到mvp架构,主要是因为项目是一个比较老的项目,最近公司要做一个新的项目,我决定用一下mvp架构,现在来做一下笔记。

    首先这是我mvp架构的一部分,
    base文件夹:这里面基本就是一些基类,
    bean文件夹: 实体类,
    contact文件夹: 关联着mvp架构的,
    model文件夹:做数据请求的
    presenter文件夹:做model与view调度操作。

    . 首先我们来看一下我的BaseActivity

    public abstract class BaseActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        @Override
        public void setContentView(@LayoutRes int layoutResID) {
            super.setContentView(layoutResID);
            initView();
            requestData();
        }
    
        /**
         *todo:初始化组件
         *time:2017/5/17 11:28
         *update_time:2017/5/17
         *params:
         **/
        public abstract void initView();
    
        /**
         *todo:请求数据
         *time:2017/5/17 11:29
         *update_time:2017/5/17
         *params:
         **/
        public abstract void requestData();
    }
    
    

    一般打开一个界面都会做initView()与requestData()操作,所以我这里写两个抽象方法,让子类实现就好了。

    再看一下我的BaseModel

    public interface BaseModel {
    
        void requestData(ZLRequestParam param);
    
    }
    
    
    

    我的BaseModel里面有一个请求数据的操作,因为所有的界面都有可能需要请求数据,反正我写一个接口来满足我的需求,
    另外,ZLRequestParam 这个类里面有3个参数,我说明一下:

    1. url 网络请求的路径,
    2. params 需要的网络请求参数,
    3. ZLResponseCallback 网络请求的回调,返回成功与失败。

    再看一下我的BasePresenter

    
    public interface BasePresenter {
        
        
        /**
         *todo:关联model的请求数据
         *time:2017/5/17 11:54
         *update_time:2017/5/17
         *params:
         **/
        void requestModelData();
    }
    
    
    

    就如上面的basemodel一样,我的BasePresenter一般可能会有一个调度网络请求的方法,我也同basemodel一样,写一个这样的接口来满足我们的需求。

    再看看BaseView

    
    public interface BaseView<T> {
    
        /**
         *todo:展示数据
         *time:2017/5/17 11:36
         *update_time:2017/5/17
         *params:
         **/
        void setData(T t);
    
        void showProgress();
    
        void dismissProgress();
    
    
    }
    
    

    baseView里面有三个方法,我只说一下setData 因为我需要用presenter来调度数据展示,我只需要在presenter中调用这个setData方法就可以达到目的。所以我需要把数据提供过来,一般我们又不知道数据类型,这时我设置一个泛型数据。来满足我们的需求。

    再看一下。ZLResponseCallback

    public interface IResponseCallback {
    
        /**
         *todo:成功的请求
         *time:2017/5/17 11:30
         *update_time:2017/5/17
         *params:返回的数据类型
         **/
        void responseSuccess(ZLResponse response);
    
        void responseFailure();
    
    }
    
    

    这个类不难理解,但我需要说明的是ZLReponse

    1. 服务器返回的json数据,可以通过个这个数据,再用fastjson来转换成我们需要的数据。
    2. 网络请求路径
    3. 网络请示的成功或者与失败码

    MainModelBean 这个类没有什么好说的,略过。

    接下来,IMainContact类。

    
    public interface IMainContact {
    
        interface Model extends BaseModel {
    
        }
    
        interface View extends BaseView<MainModelBean> {
    
        }
    
        interface Presenter extends BasePresenter{
    
        }
    
    }
    
    
    

    这里面我直接把需要的MVP结构全部串联在一起,别人过来看代码就会觉得代码结构特别清晰,里面有各自需要实现的接口,自己也可以定义一下自己需要的接口方法,当然一些基础的接口已经写在了接口基类中了,前面已经说了。
    另外注意一下,我这个View的接口已经指定了泛型的数据类型。

    接下来看一下MainModel

    public class MainModel implements IMainContact.Model {
        @Override
        public void loadData(ZLRequestParam param) {
            if(Const.network){
                param.callback.responseSuccess(result);
            }else{
                param.callback.responseFailure();
            }
        }
    }
    
    
    

    这里面是做网络的请求,没有啥好说的呢。

    再看一下如何使用这个MainPresenter

    
    
    public class MainPresenter implements IMainContact.Presenter, IResponseCallback<MainModelBean> {
    
        private IMainContact.View mainView;
        private IMainContact.Model mainModel = new MainModel();
        private Context mContext;
    
        public MainPresenter(Context context, IMainContact.View view) {
            this.mContext = context;
            this.mainView = view;
        }
    
        @Override
        public void requestModelData() {
        //这里我自己创建了一个构造了一个请求的东西。
            ZLRequestParam requestParam = new ZLRequestParam();
            Map<String,String> params = new HashMap<>();
    
            requestParam.url = "http://123432232";
            requestParam.params = params;
            requestParam.callback = this;
            mainModel.loadData(requestParam);
        }
    
        @Override
        public void responseSuccess(ZLResponse response) {
    
            //获取到数据后来展示数据。
    
            final MainModelBean mainModelBean = Json.parseObject(response.body,MainModelBean.class);
    
            mainView.showData(mainModelBean);
            mainView.dismissProgress();
        }
    
        @Override
        public void responseFailure() {
            Toast.makeText(mContext, "加载数据失败", Toast.LENGTH_SHORT).show();
            mainView.dismissProgress();
        }
    }
    
    
    

    再看一下MVPActivity

    
    
    public class MVPActivity extends BaseActivity implements IMainContact.View {
        private ProgressBar mProgressBar;
        private TextView tvDetail;
        private IMainContact.Presenter mMainPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
        }
    
        @Override
        public void initView() {
            mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
            tvDetail = (TextView) findViewById(R.id.textView);
        }
    
        @Override
        public void requestData() {
            mMainPresenter = new MainPresenter(this, this);
            //制造延迟效果
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mMainPresenter.loadModelData();
                }
            }, 2000);
    
        }
    
    
        @Override
        public void setData(MainModelBean mainModelBean) {
            StringBuilder sb = new StringBuilder();
            sb.append("城市:");
            sb.append(mainModelBean.city);
            sb.append("时间:");
            sb.append(mainModelBean.time);
            sb.append("天气:");
            sb.append(mainModelBean.weather);
            tvDetail.setText(sb.toString());
        }
    
        @Override
        public void showProgress() {
            mProgressBar.setVisibility(View.VISIBLE);
        }
    
        @Override
        public void dismissProgress() {
            mProgressBar.setVisibility(View.GONE);
        }
    }
    
    
    

    这里的代码就没有啥好讲的了,大家直接看代码就行了。

    这样整个mvp流程就算完成了。

    相关文章

      网友评论

          本文标题:也许是对Android MVP讲解的最清楚的

          本文链接:https://www.haomeiwen.com/subject/ffyzvxtx.html