初探MVP

今天估计是这学期最后一天花这么多时间在Android上了,因为接下来的一段时间里,我将会不断的考试不断的做实验不断的课程设计,而偏偏我是个学粉。。学渣已经形容不了我了,现在的状态真的是渣都不剩了。不过还好还好有自己喜欢的事,有事没事可以看看书看看博客撩撩妹。今天写一下关于MVP架构的,我尽量将我这个初学者思考过程说清楚。不扯淡先看看今天的demo的预览图。

阿拉蕾
开波

本来我也想先给大家说说什么是MVC然后MVP怎样来的,然后摔出一大堆官方的文档,接着说自己的感受。但是这些基本那些介绍MVP的博文都会说到,我就不说了,因为MVC的话,个人觉得你在写大一点的Demo时自然而然的就会抽取提炼,那大概就是MVC了吧?大差不差。那么什么是MVP呢?下面po图(第一次画图我知道丑不过先将就着吧):

MVP

上面的图其实已经说清楚了什么是MVP

  1. View层仅负责加载视图(Activity or Fragment)与用户交互(键盘输入),不处理业务逻辑。
  2. Model层负责处理业务。
  3. Presenter层负责控制两者之间的交往?(用这个次准确吗),因此Presenter必须揣有ViewModel的实例。
    要点就这三点,下面在代码中说明吧。

中场

看代码总是最轻松的,下图即为demo的java文件。


Demo

我先介绍一下各部分的作用:

  1. config因为此次顺带复习了一溜Retorfit,所以CallServiceRetrofit的接口,Config则是我在聚合数据拿的一个新闻APi。在此谢谢阿里妈妈和马云爹爹。
  2. model是业务层,里面有NewInfo这个接收解析后Json数据的实体bean,NewLogic则是业务逻辑处理类,INewCallBack是一个监听网络请求后的回调。
  3. presenter是用以给model和view交互的中间人
  4. view里面有一个定义给MainActivity使用的接口ViewLogic,通过此接口我们可以给界面添加交互所需的方法。同时因为交互需要来自model的数据,但是并不能直接拿到所以可以拿到Presenter实例间接获取数据。当然由图可知通过此接口我们可以在Presenter拿到View的实例。
下面看代码:

model层

  • NewLogic.java
/* 业务逻辑:分析可知功能仅仅为申请新闻数据*/
public class NewsLogic {

    private  CallService callService;

    public NewsLogic() {
        Retrofit mRetrofit = new Retrofit.Builder().baseUrl(Config.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create()).build();
        callService = mRetrofit.create(CallService.class);
    }

    public void getNew(Map<String,String> map, final INewCallBack callBack){
        Call<NewInfo> call = callService.getNewInfo(map);

        call.enqueue(new Callback<NewInfo>() {
            @Override
            public void onResponse(Call<NewInfo> call, Response<NewInfo> response) {
                if (response.isSuccessful()){
                    callBack.onSucceed(response);
                }else{
                    callBack.onFailure("获取新闻信息失败");
                }
            }

            @Override
            public void onFailure(Call<NewInfo> call, Throwable t) {
                callBack.onFailure("获取新闻信息失败");
            }
        });
    }
}```
 * **NewInfo**这个类是通过**GsonFormat**解析的太长所以在这里不放了。

**View层**
**ViewLogic.java**

public interface ViewLogic {

//显示加载bar
void showProgress();

//隐藏加载bar
void hideProgress();

//显示新闻内容
void showInfo(NewInfo newInfo);

//获取失败时操作
void showError(String 获取新闻信息失败);

}```
MainActivity.java

public class MainActivity extends AppCompatActivity implements ViewLogic {

    //一些声明
    private Button mButton;
    private Presenter mPresenter = new Presenter(this);/*获取Presenter实例间接货物model数据*/
    private ProgressBar mProgress;
    private TextView mTitle,mTime;
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();/*初始化控件*/
    }

    private void init() {
        mTitle = (TextView) findViewById(R.id.title);
        mTime = (TextView) findViewById(R.id.time);
        img = (ImageView) findViewById(R.id.img);
        mProgress = (ProgressBar) findViewById(R.id.progress);
        mButton = (Button) findViewById(R.id.btn_get);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPresenter.getInfo();/*获取新闻数据*/
            }
        });
    }

    @Override
    public void showProgress() {
        mProgress.setVisibility(View.VISIBLE);/*显示加载条*/
    }

    @Override
    public void hideProgress() {
        mProgress.setVisibility(View.GONE);/*隐藏加载条*/
    }

    /***
     * 显示新闻数据
     * @param newInfo
     */
    @Override
    public void showInfo(NewInfo newInfo) {
        mTitle.setText(newInfo.getResult().getData().get(0).getTitle());
        mTime.setText(newInfo.getResult().getData().get(0).getDate());
        Picasso.with(this).load(newInfo.getResult().getData().get(0).getThumbnail_pic_s()).into(img);
    }

    /**
     * 获取出错时
     * @param 获取新闻信息失败
     */
    @Override
    public void showError(String 获取新闻信息失败) {
        Toast.makeText(this, "获取新闻信息失败", Toast.LENGTH_SHORT).show();
    }
}```
 * Activity仅仅用以加载视图和与用户交互没有过多的业务逻辑处理。

**Presenter层**
**Presenter.java**

public class Presenter {

//y必须拥有molde层和view层实例
private NewsLogic mNewsLogic;
private ViewLogic mViewLogic;

public Presenter(ViewLogic viewLogic) {
    mViewLogic = viewLogic;
    mNewsLogic = new NewsLogic();
}
//功能只有获取数据
public void getInfo(){
    mViewLogic.showProgress();
    HashMap<String, String> map = new HashMap<>();
    map.put("type","tiyu");
    map.put("key", Config.KEY);
    mNewsLogic.getNew(map, new INewCallBack() {
        @Override
        public void onSucceed(Response<NewInfo> response) {
            NewInfo newInfo = response.body();
            mViewLogic.hideProgress();
            mViewLogic.showInfo(newInfo);
        }

        @Override
        public void onFailure(String 获取新闻信息失败) {
            mViewLogic.hideProgress();
            mViewLogic.showError(获取新闻信息失败);
        }
    });
}

}```

下半场

其实也可以通过一个不太恰当的例子来阐述什么是MVP,我们可以把View看作现流行的网红女主播,在MVC的时代,咱们的主播除了展示自己美好的身材以外,还需要不断的说“喜欢主播的宝宝可以点亮,送的礼物越多主播的浮力越大哦”(此看作逻辑处理),这样就会造成咱们的女主播一边喊一边应付浮力多辛苦,但是在MVP的时代,以上逻辑交给了中间人Presenter,也就是场馆在不断的发弹幕处理之前需要主播处理的业务逻辑,而咱们的女主播呢,就可以专心的表演了仅仅充当加载视图的功能。如果大家不相信,可以下载个直播软件试试哈(我是不是暴露了什么哈哈哈。。。),这个例子不知道准不准确,但是以我初学者的眼神大差不差。今天的笔记就写到这里了,不知道是否说得明白,大家也在github上下载我的demo来看看。我的github地址


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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,486评论 25 707
  • Android App的设计架构:MVC,MVP,MVVM与架构经验谈1. 架构设计的目的1.1 通过设计使程序模...
    天空在微笑阅读 4,143评论 1 20
  • 我身边的很多事情都是世俗的 我不停希望 祈求它可以有一个不落俗套意外的结局 水落石出的都世俗了 没有结果的我继续祈求着啊
    雀杏阅读 203评论 0 0
  • 她,就一个人静静地坐在角落里,一声也不吭。这会球场上有多场比赛,时而会出现精彩的好球,别人都在鼓掌叫好,她依旧面无...
    找伴运动阅读 298评论 0 1