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

来源:互联网 发布:博罗县网络问政平台 编辑:程序博客网 时间:2024/05/28 11:48

本人从事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的idprivate int id = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    id = 0;    if(savedInstanceState!=null){        //取出下标状态        id = savedInstanceState.getInt("id");    }    presenter.onCreate(id);}/** *  防止Activity保存Fragment状态 * @param outState */@Overridepublic void onSaveInstanceState(Bundle outState) {    //保存下标状态    outState.putInt("id",id);}@Overridepublic void showLoading() {}@Overridepublic void hideLoading() {}@Overridepublic MainActPresenter initPresenter() {    presenter = new MainActPresenter(this);    return presenter;}@Overridepublic int initRootView() {    return R.layout.act_main;}@Overridepublic void initView() {    rgMain = (RadioGroup) findViewById(R.id.rg_main);    scheduleFrg = new ScheduleFrg();    messageFrg = new MessageFrg();    contactFrg = new ContactFrg();    userFrgFrg = new UserFrg();}@Overridepublic void bindingEvent() {    rgMain.setOnCheckedChangeListener(this);}@Overridepublic 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;}@Overridepublic 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();}@Overridepublic 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
原创粉丝点击