关闭

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

129人阅读 评论(0) 收藏 举报

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:132次
    • 积分:11
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档