25. */
26.
27. @Override
28. public void initViews() {
29. // Actionbar settins
30.
31. // set event listeners
32. }
33.
34. @Override
35. public void openDatePickerDialog() {
36. DatePickerFragment.newInstance().show(getSupportFragmentManager(),
37. DatePickerFragment.TAG);
38.
39. // do not write logic here... all logic must be passed to the Presenter
40. mTopPresenter.updateCalendarDate();
41. }
42.
43. @Override
44. public void startListActivity() {
45. startActivity(new Intent(this, ListActivity.class));
46. }
47.}
这是Presenter类,最重要的一点是Presenter仅仅是连接View与Model的适配桥梁。
比如,TopUseCase#saveCalendarDate()是对TopPresenter细节隐藏的,同样对TopView也是如此。
你不需要关心数据结构,也不需要关心业务逻辑是如何工作的。
因此你可以对TopUseCase执行单元测试,因为业务逻辑与视图层是分离的。
1.public class TopPresenter {
2.
3. @Nullable
4. private TopView mView;
5.
6. private TopUseCase mUseCase;
7.
8. public TopPresenter() {
9. mUseCase = new TopUseCase();
10. }
11.
12. public void onCreate(@NonNull TopView topView) {
13. mView = topView;
14.
15. // here you call View's implemented methods
16. mView.initViews();
17. }
18.
19. public void updateCalendarDate() {
20. // do not forget to return if view instances is null
21. if (mView == null) {
22. return;
23. }
24.
25. // here logic comes
26. String dateToDisplay = mUseCase.getDateToDisplay(mContext.getResources());
27. mView.updateCalendarDate(dateToDisplay);
28.
29. // here you save date, and this logic is hidden in UseCase class
30. mUseCase.saveCalendarDate();
31. }
32.}
当然,尽管业务逻辑被实现在Activity类中,你依然可以执行单元测试,只不过这会耗费很多时间,而且有些复杂。
可能需要更多的时间来运行App,相反,你本应该充分利用测试类库的性能,如Robolectric。
总结
这里没有万能药,而且MVP也仅仅是解决方案之一,它可以与其他方法协同使用,同样,也可以有选择的用于不同项目。
【编辑推荐】
1.AndroidStudio+smalidea进行smail动态调试
2.Android应用内存泄漏的定位、分析与解决策略
3.基于JavaSocket的自定义协议,实现Android与服务器的长连接
(一)
4.基于JavaSocket的自定义协议,实现Android与服务器的长连接
(二)
5.34个Android常用adbshell命令汇总