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

本人从事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。



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值