Android MVP模式架构分析

开始新的项目,当然前期工作需要做足,磨刀不误砍柴工。

公司已经把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等,这个是必须的所以就不细究了。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2017 HACKGROUND All Rights Reserved.

UV : | PV :