开始新的项目,当然前期工作需要做足,磨刀不误砍柴工。
公司已经把iOS版本开发出来,这几天都是忙着看需求然后架构android版本,刚好研究了一下android架构的MVP模式觉得不错,所以想记录分享。 MVC模式大家都比较了解,先看一张图看看MVC跟MVP的区别 刚初学的时候接触MVC模式,一直强行把activity来充当Controller,搞得activity代码上千行(因为xml布局太懒惰了),不方便后期维护,实际activity只是view层 实际在android开发中完整的用MVC模式是有点吃力的,你需要单独写controller层来处理逻辑,当然还有MVVM模式,model-view-viewmodel,这需要依赖数据绑定,没有细细研究。那我们来看看MVP模式吧
可以看到MVP模式中有个Presenter层
MVP有什么优势 MVP模式可以让数据跟界面完全分离,View跟Model完全的解耦,方便我们做单元测试,同时也给activity进行减压
Presenter presenter层主要是处理一些数据逻辑,完成Model跟view层的交互,但是model跟view是无法单独交互的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class UserPresenter { FeedActivity mView; FeedService feedService; public UserPresenter (FeedActivity mView, FeedService feedService) { this .mView = mView; this .feedService = feedService; } public void loadFeeds () { User user = new User(); user.setId("561103121400006a6496b6c6" ); user.setUsed_ids(new ArrayList<String>()); feedService.getApi().getFeeds(user, new Callback<BaseModel<List<Feed>>>() { @Override public void success (BaseModel<List<Feed>> listBaseModel, Response response) { mView.display(listBaseModel.getData()); } @Override public void failure (RetrofitError error) { } }); } }
View 这里主要是activity,fragment(如果对fragment的生命周期不太了解就慎用),dialog等界面元素 只是单纯的处理界面的交互
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class FeedActivity extends AppCompatActivity { @Bind (R.id.recyclerView) RecyclerView feedRv; private FeedAdapter feedAdapter; private List<Feed> feeds; private UserPresenter userPresenter; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_feeds); ButterKnife.bind(this ); initData(); getData(); } private void initData () { feeds = new ArrayList<>(); feedAdapter = new FeedAdapter(this ,feeds); feedRv.setLayoutManager(new StaggeredGridLayoutManager(this , null , 3 , 5 )); feedRv.setAdapter(feedAdapter); userPresenter = new UserPresenter(this ,FeedService.getInstance()); } private void getData () { userPresenter.loadFeeds(); } public void display (List<Feed> feeds) { this .feeds.addAll(feeds); feedAdapter.notifyDataSetChanged(); } }
Model 这里主要是一些entity,bean等,这个是必须的所以就不细究了。