最近很火的MVP+Retrofit2+rxjava+Dagger2框架 -- MVP

原创 2016年08月29日 13:21:59

本人从事Android开发已经有一定的时间,已经很熟悉了MVC的开发模式。

然而突然发现,MVP+Retrofit2+rxjava+Dagger2最近很火,很多人都推荐使用这种模式进行开发。

所以目前来学习下,以下内容只是个人见解。


1.什么是MVP?

M:Model   ---数据管理层

V:View   ---控件显示与用户交互层

P:Presenter   ---协调Model与View之间的操作,逻辑层


在看完以上的解释后,我相信大家大概明白了为什么要使用MVP。

因为MVC模式中,Controller既需要负责逻辑的处理,又要负责控件显示。

而MVP,相当于把MVC中的Controller拆分为了V + P。


我对MVP模式的理解是:

一切的逻辑操作全部放在Presenter中,在Presenter中通过对Model、View对象的操作达到业务逻辑的实现。

而Model层只做与数据相关的操作。

View层只做控件的显示操作。


那么具体的还是来看代码吧:

如图:

MainAct是一个Activity,实现了MainActView接口。

MainActPresenter是逻辑层。


MVP中的V,指的便是MainAct。

MainAct作为MainActView的实现类,实现了你如何去做控件相关的操作。

MainActView:

public interface MainActView extends BaseActView {

    //获取Fragments
    List<Fragment> getFragments();

    //显示特定Fragment
    void showFragment(int position);

}

MainAct:
public static final String EXT_FRAGMENT = "fragment_name";
private MainActPresenter presenter;
private List<Fragment> frgs;
private FragmentManager ftManager;
private FragmentTransaction transaction;
//日程
private ScheduleFrg scheduleFrg;
//消息
private MessageFrg messageFrg;
//联系人
private ContactFrg contactFrg;
//我
private UserFrg userFrgFrg;
//底部导航栏
private RadioGroup rgMain;
//记录选中Fragment的id
private int id = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    id = 0;
    if(savedInstanceState!=null){
        //取出下标状态
        id = savedInstanceState.getInt("id");
    }
    presenter.onCreate(id);
}


/**
 *  防止Activity保存Fragment状态
 * @param outState
 */
@Override
public void onSaveInstanceState(Bundle outState) {
    //保存下标状态
    outState.putInt("id",id);
}
@Override
public void showLoading() {

}

@Override
public void hideLoading() {

}

@Override
public MainActPresenter initPresenter() {
    presenter = new MainActPresenter(this);
    return presenter;
}

@Override
public int initRootView() {
    return R.layout.act_main;
}

@Override
public void initView() {
    rgMain = (RadioGroup) findViewById(R.id.rg_main);
    scheduleFrg = new ScheduleFrg();
    messageFrg = new MessageFrg();
    contactFrg = new ContactFrg();
    userFrgFrg = new UserFrg();
}

@Override
public void bindingEvent() {
    rgMain.setOnCheckedChangeListener(this);
}

@Override
public List<Fragment> getFragments() {
    if (frgs == null) {
        frgs = new ArrayList<>();
        frgs.add(scheduleFrg);
        frgs.add(messageFrg);
        frgs.add(contactFrg);
        frgs.add(userFrgFrg);
        ftManager = getSupportFragmentManager();
        transaction = ftManager.beginTransaction();
        transaction.add(R.id.frg_layout, scheduleFrg);
        transaction.add(R.id.frg_layout, messageFrg);
        transaction.add(R.id.frg_layout, contactFrg);
        transaction.add(R.id.frg_layout, userFrgFrg);
        transaction.commit();
    }
    return frgs;
}

@Override
public void showFragment(int position) {
    id = position;
    ftManager = getSupportFragmentManager();
    transaction = ftManager.beginTransaction();
    Observable.from(frgs)
            .subscribe(new Action1<Fragment>() {
                @Override
                public void call(Fragment fragment) {
                    transaction.hide(fragment);
                }
            });
    //根据选择,切换当前Fragment
    transaction.show(frgs.get(position));
    transaction.commit();
}

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
    presenter.onRadioGroupClick(group.indexOfChild(group.findViewById(checkedId)));
}

仔细一看,你会发现,MainAct中好像全部是重写的方法,并没有逻辑。
没错,一切的逻辑全部放在Presenter中,MainAct只是单纯的去显示控件。

下面再来看一下MainActPresenter:

private MainActView mainActView;

public MainActPresenter(MainActView mainActView) {
    this.mainActView = mainActView;
}

public void onCreate(int position) {
    mainActView.getFragments();
    mainActView.showFragment(position);
}

public void onRadioGroupClick(int position) {
    mainActView.showFragment(position);
}

你可以看到,在Presenter里有一个MainActView的实现类对象。
那么整体逻辑便是:在Presenter里操作MainActView,控制它什么时候去做相关的控件操作,而具体的控件操作,由Activity完成。

那么看到这里,有的人会问了,Model呢?
不要急。当整体框架结束后,Dagger2实现的DataManager可以充当Model。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

RXjava+Retrofit+dagger2打造自己的MVP框架

RXjava+Retrofit+dagger的入门         前言:现在RXjava+Retrofit+dagger可谓是如日中天,当时头一次接触都有一种无从入手的感觉,那么我来分享一下我的学习...

mvp框架学习实战代码(配合retrofit+dagger2+rxjava)

转载请标明出处,谢谢。 最近一直在学习框架的搭建和使用,对于mvp,很多开发者有自己的独特见解,褒贬不一。不过我还是觉得它有学习的必要。在某些大项目上,使用mvp可以方便后期的代码维护和更新。废话不...

【BaseFragment】基于MVP+Dagger2+Retrofit+Rxjava框架之BaseFragment

base类是基础,小伙伴先大致看一下思路后面等整个框架带领大家搭建起来以后我再给出项目的整个地址返回父布局parentViewprotected View parentView; //onCreate...

mvp+dagger2+retrofit2+rxjava 项目框架 最佳实践

概述 转载地址:http://www.jianshu.com/p/d7b9efde7e15 原来一直在用Android最原生的框架进行开发,最多也就使用了butterknife,减少了很多...

owspace 是基于 MVP+Dagger2+Retrofit2.0+Rxjava 的 APP

owspace 是基于 MVP+Dagger2+Retrofit2.0+Rxjava 的 APP

《易读》一个模仿网易云音乐UI,Rxjava+Retrofit+dagger2+MVP的开源项目

EasyReader 一款模仿网易云音乐UI,使用Retrofit + RxJava + dagger2 + MVP的阅读类开源项目。本项目对网络返回进行了统一处理,抽取BaseActivity和B...

RxJava+Retrofit+OkHttp3+Dagger2+MVP构建Android项目简单例子

RxJava+Retrofit+OkHttp3+Dagger2+MVP,最新刚接触这个框架,然后从别人那学来的用上了,写成了一个简单的demo,准备自己的下一个项目用这框架开发
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)