美文网首页
Android架构之MVP详解

Android架构之MVP详解

作者: 沉淀者 | 来源:发表于2020-04-22 15:45 被阅读0次

    一、MVP简介

    MVP由Model、View、Presenter构成。
    M(Model) 数据相关层
    V(View) 视图层,如Activity上的布局
    P(Presenter) 纽带层,用来连接Model与View.

    1. View层定义View.interface,用来定义View的行为。一般由Activity或者是Fragment来实现这个接口,它定义了View视图的各种变化,如设置Textview,加载对话框,更新进度条等。
    2. Model层定义Modle.interface,这个是用来定义数据层发生变化时的通知接口,因为Model不能直接与View交互,所以它与Presenter交互,然后再通过Presenter间接达到与View的交互。
    3. Presenter翻译的意思是主持人,也就是主持场合,控制节奏的意思。在这时Presenter就负责具体的业务逻辑,请求数据,把数据送到Model,或者监听Model的数据变化,接受View层的动作,负责通过通知View层的视图变化。

    二、MVP实战

    1.需求分析

    假设现在需要做一款APP,就是显示天气,界面很简单,一个TextView显示天气信息,一个Button用来请求实时天气。
    如下图所示


    实例.png

    用户点击获取实时天气的按钮,界面上会弹出正在获取中的进度对话框,等待数据加载成功后,对话框消失。Textview显示就新的天气情况。

    2.功能开发

    1.代码整体结构

    代码结构.png

    2.View层的接口定义及实现

    在MVP中Activity用来专注视图的表现。
    View的表现当然要用View.interface接口来定义 ,定义了接口之后再MainActivity中去实现这些方法
    View.interface如下:

    public interface IWetherView {
        //显示天气信息
        public void onInfoUpdate(String info);
        //显示获取信息等待对话框
        public void showWaitingDialog();
        //取消显示对话框
        public void dissmissWaitingDialog();
    }
    

    3.Model层的接口定义及实现

    Model层是数据层,用来存储数据并且提供数据。定义一个接口和实现这个接口的类就可以了。
    接口定义如下:

    public interface IWetherModel {
    
        //提供数据
        public String getInfo();
    
        //存储数据
        public void setInfo(String info);
    }
    

    它的实现文件如下:

    public class IWetherModelImpl implements IWetherModel {
    
        @Override
        public String getInfo() {
            return null;
        }
    
        @Override
        public void setInfo(String info) {
    
        }
    }
    

    4.Presenter代码及实现

    Presenter就是一个中介,负责调用view和model里面的方法
    完整的Presenter代码如下:

    public class WetherPresenter {
        IWetherModelImpl mModel;
        IWetherView mView;
    
        public WetherPresenter(IWetherView mView) {
            this.mView = mView;
            mModel = new IWetherModelImpl();
        }
    
        public void requestWetherInfo(){
            getNetworkInfo();;
        }
    
        private void showWaitingDialog(){
            if (mView != null) {
                mView.showWaitingDialog();
            }
        }
    
        private void dissmissWaitingDialog(){
            if (mView != null) {
                mView.dissmissWaitingDialog();
            }
        }
    
        private void updateWetherInfo(String info){
            if (mView != null) {
                mView.onInfoUpdate(info);
            }
        }
    
        private void saveInfo(String info){
            mModel.setInfo(info);
        }
    
        private String localInfo(){
            return mModel.getInfo();
        }
    
        private void getNetworkInfo(){
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    try {
                        //打开等待对话框
                        showWaitingDialog();
                        //模拟网络耗时
                        Thread.sleep(6000);
    
                        String info = "21度,晴转多云";
                        //保存到Model层
                        saveInfo(info);
                        //从Model层获取数据,为了演示效果,实际开发中根据情况需要。
                        String localinfo = localInfo();
    
                        //通知View层改变视图
                        updateWetherInfo(localinfo);
    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        //取消对话框
                        dissmissWaitingDialog();
                    }
                }
            }).start();
        }
    }
    

    5.MainActivity代码编写

    其实MainActivity就是实现view的接口,里面的什么关于显示对话框、加载文本那些view的操作都是在这里实现的。整个MainActivity.java代码如下:

    public class MainActivity extends AppCompatActivity implements IWetherView{
        private static final String TAG = "MainActivity";
    
        WetherPresenter mPresenter;
        private TextView mTvInfo;
        private Button mButton;
        private ProgressDialog mDialog;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mPresenter = new WetherPresenter(this);
    
            mTvInfo = (TextView) findViewById(R.id.tv_info);
            mButton = (Button) findViewById(R.id.btn_request);
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mPresenter.requestWetherInfo();
                }
            });
        }
    
        @Override
        public void onInfoUpdate(final String info) {
            Log.d(TAG, "onInfoUpdate: "+info);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mTvInfo.setText(info);
                }
            });
        }
    
        @Override
        public void showWaitingDialog() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if(mDialog != null && mDialog.isShowing()){
                        mDialog.dismiss();
                    }
    
                    mDialog = ProgressDialog.show(MainActivity.this,"","正在获取中...");
                }
            });
    
        }
    
        @Override
        public void dissmissWaitingDialog() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if(mDialog != null && mDialog.isShowing()){
                        mDialog.dismiss();
                    }
                }
            });
    
        }
    }
    

    相关文章

      网友评论

          本文标题:Android架构之MVP详解

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