Android MVP

MVP,抽取Controller中业务逻辑独立到Presenter,解决Controller臃肿,View与Presenter间通过Interface交互,代码逻辑更加清晰,同时Presenter更方便写单元测试;

架构设计:

架构实现:

View

View抽象接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface ZZMvpView<T> {
/**
* 注入当前View需要的Presenter
* @param presenter
*/
void setPresenter(T presenter);
/**
* 获取当前View注入的Presenter
* @return
*/
T getPresenter();
}

Fragment实现

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
public abstract class ZZBaseMvpFragment<PresenterType extends ZZMvpPresenter>
extends Fragment
implements ZZViewListener, ZZMvpView<PresenterType> {
private AppCompatActivity mActivity;
private PresenterType presenter;
@Override
public final void setPresenter(PresenterType presenter) {
this.presenter = presenter;
}
/**
* 获取当前Fragment对应的Presenter。
* @return
*/
@Override
public final PresenterType getPresenter() {
return presenter;
}
/**
* 创建被当前Fragment管理的子Fragment对应的Presenter。
* @return
*/
@CallSuper
protected ZZMvpPresenter createChildFragmentPresenter() {
return null;
}
/**
* 获取当前Fragment所在的Activity。
* @return
*/
protected final AppCompatActivity getContainerActivity(){
return mActivity;
}
@CallSuper
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity = (AppCompatActivity)context;
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName(), "onAttach");
}
}
@CallSuper
@Override
public void onDetach() {
super.onDetach();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName(), "onDetach");
}
}
@CallSuper
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
if (LogUtils.DEBUG){
if (bundle == null){
LogUtils.d(getClass().getSimpleName(), "onCreate");
}else{
LogUtils.w(getClass().getSimpleName(), "onCreate Fragment非正常销毁恢复");
}
}
}
@CallSuper
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null){
if (LogUtils.DEBUG){
LogUtils.w(getClass().getSimpleName(), "Fragment非正常销毁恢复");
}
onRestoreRequireInstanceState(savedInstanceState);
restoreChildFragmentPresenter();
}else{
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName(), "Fragment正常初始化");
}
}
initView();
// 向presenter注入view
presenter.onTakeView(this);
// Fragment重启后,恢复presenter中存储在bundle中的数据
if (savedInstanceState != null){
// presenter.onRestoreInstanceState(savedInstanceState);
}
setListener();
initData(savedInstanceState);
presenter.initData();
}
/**
* 重新恢复子child fragment
*/
private void restoreChildFragmentPresenter() {
FragmentManager fm = getChildFragmentManager();
if (fm != null) {
List<Fragment> fragments = fm.getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null && fragment instanceof ZZMvpView) {
ZZMvpView mvpView = (ZZMvpView) fragment;
if (mvpView.getPresenter() == null) {
ZZMvpPresenter presenter = createChildFragmentPresenter();
mvpView.setPresenter(presenter);
}
}
}
}
}
}
@CallSuper
@Override
public void setListener() {
}
@CallSuper
@Override
public void onSaveInstanceState(Bundle bundle) {
super.onSaveInstanceState(bundle);
onSaveRequireInstanceState(bundle);
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
public void onStart() {
super.onStart();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
public void onStop() {
super.onStop();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
public void onResume() {
super.onResume();
if (presenter != null){
presenter.onResume();
}
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
public void onPause() {
super.onPause();
if (presenter != null){
presenter.onPause();
}
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
public void onDestroyView() {
super.onDestroyView();
//presenter不可设置为空,可能存在Fragment重启
//presenter = null;
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
public void onDestroy() {
super.onDestroy();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
if (presenter != null){
presenter.onDestroy();
}
}
}

Activity实现

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
public abstract class ZZBaseMvpActivity<PresenterType extends ZZMvpPresenter>
extends AppCompatActivity
implements ZZViewListener {
private PresenterType presenter;
/**
* 创建Presenter,由于Activity无法在外部创建,Presenter需要在Activity中实例化。
* @return
*/
protected abstract PresenterType createPresenter();
/**
* 根据Fragment的类型,创建对应的Presenter。
* @param mvpView
* @return
*/
protected abstract ZZMvpPresenter createFragmentPresenter(ZZMvpView mvpView);
/**
* 获取当前Activity对应的Presenter。
* @return
*/
protected final PresenterType getPresenter(){
return presenter;
}
@CallSuper
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null){
if (LogUtils.DEBUG){
LogUtils.w(getClass().getSimpleName(), "Activity被非正常销毁后恢复了");
}
onRestoreRequireInstanceState(savedInstanceState);
restoreFragmentPresenter();
}else{
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName(), "Activity执行onCreate");
}
}
// 初始化view setContentView,findViewById
initView();
// 创建presenter,并注入view
if (presenter == null){
this.presenter = createPresenter();
}
presenter.onTakeView(this);
// 设置监听事件
setListener();
// 初始化数据
initData(savedInstanceState);
presenter.initData();
}
/**
* 从Activity Fragment管理器中查找Fragment
* @param clazz
* @param <T>
* @return
*/
protected final <T extends Fragment> T findFragment(Class<T> clazz){
final String targetName = clazz.getName();
final FragmentManager fm = getSupportFragmentManager();
final List<Fragment> fragments = fm.getFragments();
if (fragments != null){
for (Fragment fragment : fragments){
if (fragment != null && fragment.getClass().getName().equals(targetName)){
return (T) fragment;
}
}
}
return null;
}
/**
* Activity重启后,恢复Fragment的Presenter
*/
private void restoreFragmentPresenter(){
final FragmentManager fm = getSupportFragmentManager();
final List<Fragment> fragments = fm.getFragments();
if (fragments != null){
for (Fragment fragment : fragments){
if (fragment != null && fragment instanceof ZZMvpView){
final ZZMvpView mvpView = (ZZMvpView)fragment;
if (mvpView.getPresenter() == null){
final ZZMvpPresenter presenter = createFragmentPresenter(mvpView);
mvpView.setPresenter(presenter);
}
}
}
}
}
@CallSuper
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
onSaveRequireInstanceState(outState);
//presenter.onSave(outState);
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
/**
* 设置view的监听
*/
@CallSuper
@Override
public void setListener() {
}
@CallSuper
@Override
protected void onStart() {
super.onStart();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
protected void onStop() {
super.onStop();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
protected void onResume() {
super.onResume();
presenter.onResume();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
protected void onPause() {
super.onPause();
presenter.onPause();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
@CallSuper
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDestroy();
if (LogUtils.DEBUG){
LogUtils.d(getClass().getSimpleName());
}
}
}

Presenter

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
public interface ZZMvpPresenter<ViewType> {
/**
* Activity onCreate 或 Fragment onActivityCreate中调用注入View,只会调用一次
* @param view
*/
void onTakeView(ViewType view);
/**
* 同 Activity Fragment onResume
*/
void onResume();
/**
* 同 Activity Fragment onPause
*/
void onPause();
/**
* Activity Fragment onStart方法调用,只会调用一次
* 防止在onCreate中执行过多逻辑造成打开Activity卡顿。
*/
void initData();
/**
* Activity onDestroy 或 Fragment onDestroyView
*/
void onDestroy();
/**
* 获取当前Presenter注入的View
* @return
*/
WeakReference<ViewType> getWeakView();
}

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
/**
* 同步view的生命周期到Presenter
*/
public abstract class ZZBasePresenter<ViewType> implements ZZMvpPresenter<ViewType> {
private WeakReference<ViewType> weakView = new WeakReference<ViewType>(null);
@Override
public final void onTakeView(ViewType view) {
this.weakView = new WeakReference<ViewType>(view);
}
@CallSuper
@Override
public void onResume() {
}
@CallSuper
@Override
public void onPause() {
}
@CallSuper
@Override
public void onDestroy() {
this.weakView = new WeakReference<ViewType>(null);
}
@Override
public final WeakReference<ViewType> getWeakView() {
return weakView;
}
public void showLoading() {
ViewType viewType = getWeakView().get();
if (viewType != null) {
if (viewType instanceof ZZBaseMvpView) {
ZZBaseMvpView loadView = (ZZBaseMvpView) viewType;
loadView.showLoading();
}
}
}
public void dismissLoading() {
ViewType viewType = getWeakView().get();
if (viewType != null) {
if (viewType instanceof ZZBaseMvpView) {
ZZBaseMvpView loadView = (ZZBaseMvpView) viewType;
loadView.dismissLoading();
}
}
}
}

使用实例:

Contact接口,内部类方式定义View和Presenter接口

1
2
3
4
5
6
7
8
9
10
11
12
public interface GuideContact {
interface View{
void callView();
}
interface Presenter extends ZZMvpPresenter<View> {
void callPresenter();
}
}

Presenter使用,继承ZZBasePresenter,同时实现Contact.Presenter接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class GuidePresenter extends ZZBasePresenter<GuideContact.View>
implements GuideContact.Presenter {
@Override
public void initData() {
GuideContact.View view = getWeakView().get();
if (view != null){
view.callView();
}
}
@Override
public void callPresenter() {
Log.d("GuidePresenter", "callPresenter: ");
}
}

Fragment实现,继承ZZBaseFragment,同时实现Contact.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
public class GuideFragment<PresenterType extends GuideContact.Presenter>
extends ZZBaseFragment<PresenterType>
implements GuideContact.View{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return new View(getContext());
}
@Override
public void initViews() {
}
@Override
public void initData(Bundle savedInstanceState) {
getPresenter().callPresenter();
}
@Override
public void callView() {
Log.d("GuideFragment", "callView: ");
}
}

Activity实现,继承ZZBaseActivity,同时实现Contact.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MainActivity extends ZZBaseActivity<MainContact.Presenter> implements MainContact.View{
@Override
protected MainContact.Presenter createPresenter() {
return new MainPresenter();
}
@Override
public void initViews() {
setContentView(R.layout.activity_main);
}
@Override
public void initData(Bundle savedInstanceState) {
GuideFragment<GuidePresenter> guideFragment = (GuideFragment<GuidePresenter>) getSupportFragmentManager()
.findFragmentById(R.id.main_container);
if (guideFragment == null){
// 创建Fragment并注入Presenter
guideFragment = new GuideFragment();
guideFragment.setPresenter(new GuidePresenter());
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(R.id.main_container, guideFragment);
transaction.commit();
}else{
// Activity重启处理
LogUtils.w("guideFragment重启后恢复");
if (guideFragment.getPresenter() == null){
LogUtils.w("guideFragment重启后恢复,需要重新实例化Presenter");
guideFragment.setPresenter(new GuidePresenter());
}
}
if (guideFragment.getPresenter() == null){
}
}
@Override
public Context getAppContext() {
return this.getApplicationContext();
}
}
0%