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。

Paste_Image.png
此例子引用:http://blog.csdn.net/briblue/article/details/52839242
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容