Android MVP简单叙述

V:大哥,那个程序员想让我显示对话框咋整啊?
P:没事,我有你的接口对象,实现了方法,你拿去用就是。
V:那我里面的数据咋整????
P:没事,我还有M的接口对象,实现了数据方法,你用就没事。
V:好嘞
M:呵呵 (。ŏ_ŏ)哦

M:
model, 是APP中数据处理和业务逻辑部分。 :负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
V:
View, 一般是Activity或者Frament,view中一半都会包括prensenter的引用。负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
P:
Presenter, 他处于view和model中间 从model获取数据,然后返回给view,以及界面的交互,作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

用户的请求首先会到达View,View传递请求到特定的Presenter,Presenter从Model获取数据后,再把处理结果通过接口传递到View。

Android MVP简单叙述_第1张图片
Paste_Image.png
此例子引用:http://blog.csdn.net/briblue/article/details/52839242
Android MVP简单叙述_第2张图片
Paste_Image.png

首先先看看你的V

public interface IWetherView {
    /**
     * 显示天气信息
     *
     * @param info
     */
    void onInfoUpdate(String info);

    /**
     * 显示获取信息等待对话框
     */
    void showWaitingDialog();

    /**
     * 取消显示对话框
     */
    void dissmissWaitingDialog();
}

然后你对应的V实现层 这里直接用MainActivity代替
部分来看。首先实现接口

public class MainActivity extends AppCompatActivity implements IWetherView {
    @Override
    public void onInfoUpdate(final String info) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.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();
                }
            }
        });
    }
}

我这里直接实现代码逻辑

详解说明: 
显示天气信息无非就是更改你的textview 
onInfoUpdate()
显示对话框也很简单
showWaitingDialog()
然后是取消对话框
dissmissWaitingDialog

这样你V层的操作就OK了。V可是说是很轻松的一层,拿到数据,然后显示。M也是一样。别人给你数据,你存起来,用M的时候new一个。
所以M层数据可以为 提供数据和储蓄数据

public interface IWetherModel {

    /**
     * 提供数据
     *
     * @return
     */
     String getInfo();

    /**
     * 储存数据
     *
     * @param info
     */
     void setInfo(String info);
}

对应的实现类

public class IWetherImpl implements IWetherModel {

    private String info;

    @Override
    public String getInfo() {
        Random random = new Random();
        int seed = random.nextInt(3);
        if (seed % 2 == 0) {
            return info;
        } else {
            return info + info;
        }
    }

    @Override
    public void setInfo(String info) {
        this.info = info;
    }
}

因为我这里模拟了网络获取数据然后在显示,所以定义了string info 相信你一看就会明白 每次点击最后都会到这里来获取数据,通过随机数来给不同的天气。真实项目中并不会这样,就是json解析的Bean而已。get set方法的调用

接下来就是重头戏P层。因为你的P要和V M通信。所以你要持有他们的接口对象

    /**
     * 因为要和view以及modle双向对接 所以要持有接口调用
     */
    private IWetherModel mModel;
    private IWetherView mView;

    public WetherPresenter(IWetherView mView) {
        this.mView = mView;
        mModel = new IWetherImpl();
    }

P层是直接来操作V和M的,所以要有对应的方法。所以可以得出

/**
     * P层显示对话框
     */
    private void showWaitingDialog() {
        if (mView != null) {
            mView.showWaitingDialog();
        }
    }

    /**
     * P层取消对话框
     */
    private void dissmissWaitingDialog() {
        if (mView != null) {
            mView.dissmissWaitingDialog();
        }
    }

    /**
     * P层 更新天气信息
     *
     * @param Info
     */
    private void updateWetherInfo(String Info) {
        if (mView != null) {
            mView.onInfoUpdate(Info);
        }
    }

    /**
     * P层操作M层 保存信息
     *
     * @param info
     */
    private void saveInfo(String info) {
        mModel.setInfo(info);
    }

    /**
     * P层操作M层 获取信息
     *
     * @return
     */
    private String LocaIngo() {
        return mModel.getInfo();
    }

可以看到 每个方法的最终都是通过对象进而调用到了实际的V M ,P层的方法是为了给外部需要用P层的一个接口。自己使用也是方便。
然后写一个给V更新数据的一个方法,这个方法无非就是把你写的方法都集合到一起而已。

    /**
     * P层 模拟网络请求数据
     *
     * @return
     */
    public void getNetworkInfo() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //打开等待会话框
                    showWaitingDialog();
                    //模拟网络请求,延时1秒
                    Thread.sleep(1*1000);
                    //模拟信息
                    String Info = "21度,晴转多云";
                    //调用P层方法来进而调用M层信息
                    saveInfo(Info);
                    //此为模拟数据,真实数据应该为网络请求返回值
                    String LocaInfo = LocaIngo();
                    //更新天气信息
                    updateWetherInfo(LocaInfo);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //取消对话框
                    dissmissWaitingDialog();
                }
            }
        }).start();
    }

最后 在你的V去调用你的这个集合了所有方法的方法,

                mWetherPresenter.RequestWetherInfo();

完成。 我在代码中写了注释,相信照着写一次,然理解理解就可以,或者看看原作者的博客,代码会打包给你们,
https://github.com/XiaMuYaoDQX/MVP.git
有什么不懂的欢迎一起讨论 QQ交流群有什么不懂的大家一起讨论:5700145986

你可能感兴趣的:(Android MVP简单叙述)