最近很火的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。



最近微信上很火的小游戏【壹秒】android版——开发分享

最近在朋友圈,朋友转了一个html小游戏【壹秒】,游戏的规则是:用户按住按钮然后释放,看谁能精准地保持一秒的时间。^_^刚好刚才在linux服务器上调试程序的时候服务器挂了,腾出点时间分享下前天自己做...
  • u010794180
  • u010794180
  • 2015年07月24日 16:52
  • 3603

为什么Python这么火

几年前 Python 在国内还只是一门小众语言,但从 2011开始到现在,Python 的百度搜索指数翻了10 倍,从下图看得出 Python 在国内的流行度已经直逼 Java,大有赶超之势 一...
  • lantian_123
  • lantian_123
  • 2017年09月26日 13:14
  • 6220

给大家推荐一款有意思的棋类游戏-5i跳棋

给大家推荐一款有意思的棋类游戏-5i跳棋, 跳棋想必大家都是很了解的,这款跳棋的特点zai'yu...
  • vegerjiangsir
  • vegerjiangsir
  • 2014年10月28日 18:53
  • 433

为什么现在机器学习如此火爆

而今机器学习的改进大致在两个方面,一方面是软件,就是算法方面,从最小二乘法出发,到贝叶斯思想。另一方面就是硬件,一是采用并行计算,比如GPGPU,FPGA;二是分布式计算,比如Apache的Hadoo...
  • qq_36232445
  • qq_36232445
  • 2017年12月01日 13:44
  • 205

Java面向对象——(其他对象)

面向对象 System类 其他对象(System):类中的方法和属性都是静态的。 1、in:标准输入。默认是键盘。 2、out:标准输出。默认是控制台。 描述系统属性信息。 ...
  • u012840558
  • u012840558
  • 2014年02月24日 10:56
  • 728

一道典型的面向对象考察题

贴代码先 public class HelloWorld{ public String strMyString; public int intMyNumber; public HelloWorl...
  • shmilypeter
  • shmilypeter
  • 2014年12月11日 19:48
  • 84

为什么神经网络现在这么火

用吴恩达的话来说,就用这张图来告诉你,当数据量小的时候,神经网络的作用还没有彻底显示出来,但是,当带标签的数据量特别大的时候我们就会发现神经网络的准确率是稳定的比其他高。由图发现,很多模型在数据量大的...
  • lonely_gfwolf
  • lonely_gfwolf
  • 2017年09月03日 21:45
  • 317

面象对象的面试题

面试即将到来,心中甚是惶恐,唯有做好准备才能,临场不乱 这一篇整理的是和面象对象相关的面试题 1.面象对象的三大特征: 封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口; ...
  • shaobin1990
  • shaobin1990
  • 2017年08月25日 17:03
  • 83

为什么前端工程师很难找?(最近很火的一个话题)

1、前端是一个比较新的行业,不像C、Java之类的在学校就可以学到(当然能学到多少是另一回事),目前我还没听说哪个学校会专门为CSS、Javascript开一个课程。相比后端或者设计人才,在学校的时候...
  • u014326381
  • u014326381
  • 2015年09月05日 12:32
  • 1993

安卓开发框架(MVP+主流框架+基类+工具类)--- 开篇

搭建开发框架,开篇简介+demo+各模块传送门
  • ljy_programmer
  • ljy_programmer
  • 2017年10月09日 10:56
  • 1352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最近很火的MVP+Retrofit2+rxjava+Dagger2框架 -- MVP
举报原因:
原因补充:

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