Android MVP介绍
随着技术的发展,Activity(View) 做的事情越来越多,动辄几百上千行的代码使得 Activity 越来越臃肿。为了更好的划分视图(View)和模型(Model)之间的职责,让 View 只处理数据的展示和用户的交互,把数据的处理交由 Model 处理。
在MVP模式里通常包含4个要素:
- View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
- View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
- Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
- Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
Android MVP 好处
MVP模式可以让显示界面和数据分离,我们开发的应用可以分离至少三层,这样也可以进行独立测试。更加的好维护(代码复用)数据分离有利于信息的隐蔽等等优点,相比较他的优点,缺点就可以忽略了。
Android MVP 实例
下图是采用MVP做的一个列表页面,实现了刷新,加载更多的功能。
目录结构
View 层
view 层的接口 用来与Presenter进行交互
view 接口的实现类(Activity)
Presenter
处理网络请求以及数据分发
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
package
com
.
jwenfeng
.
moviemvp
.
presenters
;
import
android
.
util
.
Log
;
import
com
.
jwenfeng
.
moviemvp
.
model
.
Movies
;
import
com
.
jwenfeng
.
moviemvp
.
view
.
MovieView
;
import
java
.
util
.
List
;
import
cn
.
bmob
.
v3
.
BmobQuery
;
import
cn
.
bmob
.
v3
.
listener
.
FindListener
;
/**
* 当前类注释:
* 项目名:MovieMVP
* 包名:com.jwenfeng.moviemvp.presenters
* 作者:jinwenfeng on 16/4/23 16:38
* 邮箱:823546371@qq.com
* QQ: 823546371
* 公司:南京穆尊信息科技有限公司
* © 2016 jinwenfeng
* ©版权所有,未经允许不得传播
*/
public
class
MoviePresenter
extends
Presenter
{
private
MovieView
movieView
;
private
int
limit
=
8
;
// 每页的数据是8条
private
int
curPage
=
0
;
// 当前页的编号,从0开始
private
boolean
isLoading
=
false
;
private
boolean
isLast
=
false
;
public
void
attachView
(
MovieView
movieView
)
{
this
.
movieView
=
movieView
;
}
/**
* 获取数据
* */
public
void
getData
(
)
{
BmobQuery
<
Movies
>
query
=
new
BmobQuery
<>
(
)
;
query
.
setSkip
(
curPage *
limit
)
;
query
.
setLimit
(
limit
)
;
query
.
findObjects
(
movieView
.
getContext
(
)
,
new
FindListener
<
Movies
>
(
)
{
@
Override
public
void
onSuccess
(
List
<
Movies
>
list
)
{
if
(
list
.
size
(
)
>
0
)
{
if
(
movieView
.
isTheListEmpty
(
)
)
{
movieView
.
hideLoading
(
)
;
}
if
(
movieView
.
isSwipeRefresh
(
)
)
{
movieView
.
showMovies
(
list
)
;
movieView
.
hideSwipeRefresh
(
)
;
}
else
{
Log
.
e
(
"MoviePresenter"
,
curPage
+
"----"
+
list
.
size
(
)
)
;
movieView
.
appendMovies
(
list
)
;
}
curPage
++
;
isLast
=
false
;
isLoading
=
false
;
}
else
{
isLast
=
true
;
isLoading
=
false
;
movieView
.
showToast
(
"没有更多数据了"
)
;
}
}
@
Override
public
void
onError
(
int
i
,
String
s
)
{
Log
.
e
(
"MoviePresenter"
,
i
+
"---"
+
s
)
;
movieView
.
showToast
(
"查询失败:"
+
s
)
;
}
}
)
;
}
/**
* 加载更多
* */
public
void
loadMore
(
)
{
if
(
!
isLast
&&
!
isLoading
)
{
isLoading
=
true
;
getData
(
)
;
}
}
/**
* 刷新
* */
public
void
refresh
(
)
{
curPage
=
0
;
movieView
.
showSwipeRefresh
(
)
;
isLoading
=
true
;
getData
(
)
;
}
@
Override
public
void
start
(
)
{
if
(
movieView
.
isTheListEmpty
(
)
)
{
movieView
.
showLoading
(
)
;
isLoading
=
true
;
getData
(
)
;
}
}
@
Override
public
void
stop
(
)
{
}
public
boolean
isLoading
(
)
{
return
isLoading
;
}
public
boolean
isLast
(
)
{
return
isLast
;
}
}
|