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