文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关于Android MVP模式的思考

2022-06-06 12:53

关注

  这一周对现有的Android项目进行了框架重构,使用MVP模式来重新构建整个项目和包结构。来总结一下我在这个过程中理解和实践吧。   MVP概述   MVP是指Model,View和Presenter的缩写,是MVC模式的一种改进版。MVP是一种非常适合Android应用的开发模式,它将把逻辑相关代码从presentation Layer中分离出去 ,所以,所有界面应该显示什么和界面如何显示这些是相互分离的, 在理想状态下,MVP模式可以随意切换视图显示的形式。   但是,需要首先声明的是,MVP并不是 一个框架模式 ,它只负责presentation Layer。在Android项目中,还可能存在Domain Layer和Data Layer,它们分别负责业务逻辑和数据存储。关于三个layer的讨论,可以查看 clear Architecture 。

  The presenter   The presenter充当的是view和model模块中间人的角色。它从model模块获得数据并发送给view模块。 但是不同于MVC,presenter模块也决定用户和界面交互时界面如何响应 。   The View   View模块,一般由Activity或者Fragment实现,每个View实例一般都包含一个presenter实例的引用,并负责实例化presenter。理想情况下,你可以使用dagger来实现依赖注入。view的任务是当用户操作界面时,调用presenter实例的功能来进行响应。   The Model   在设计良好的分层架构中,model应该只是domain layer和业务逻辑的入口,比如说, clear architecture 。但是你也可以把所有界面显示无关的逻辑都作为model。   MVP示例   关于MVP架构的实例有很多,比如 google官方架构 。这里我给出一下我重构项目一个模块的类图,然后大致说一下实现。

  首先定义了 BaseView 和 BasePresenter 两个接口,实现了 BaseActivity 和 BaseFragment 两个基础类。需要注意的是,因为每个View都需要持有一个特定类型的presenter对象,所以,在 BaseView 定义时,使用了范型。除此之外,你可以在 initPresenter 函数中构造出所需要的presenter对象。 showLoading 和 stopLoading 函数是所有视图进行网络数据加载时所需要的方法,其具体使用场景后边可以看到,这里这两个接口是在 BaseActivity 中实现的。   public interface BaseView<T> {   void showLoading();   void stopLoading();   void initPresnter();   T getPresenter();   }   public interface BasePresenter {   }   public class BaseActivity extends Activity{   public void showLoading() {   }   public void stopLoading() {   }   }   public class BaseFragment extends Fragment {   public void showLoading() {   }   public void stopLoading() {   }   }   然后是data模块中的相关类和接口的定义。我们在 DataContract 接口中定义所有相关的view和data。   public interface DataContract {   interface DataView extends BaseView<DataPresenter> {   void showFragment(BaseFragment fragment);   }   interface DataPresenter extends BasePresenter {   void switchToDataList();   void switchToDataTree();   }   interface DataListView extends BaseView<DataListPresenter> {   void showDataList(List<String> data);   }   interface DataListPresenter extends BasePresenter {   void loadDataList();   }   interface DataTreeView extends BaseView<DataTreePresenter> {}   interface DataTreePresenter extends BasePresenter {}   }   在 DataContract 接口中,我们可以清晰的看到这个模块中所有的view和presenter类型和他们的接口。这样无疑可以帮助其他程序员快速了解本模块的业务逻辑。下面,我们来看一下 DataListFragmnet 和 DataListPresenter 的实现。   public class DataListFragment extends BaseFragment implements DataContract.DataListView {   private DataContract.DataListPresenter mPresenter;   @Override   public void initPresnter() {   mPresenter = new DataListPresenter(this);   }   @Override   public DataContract.DataListPresenter getPresenter() {   return mPresenter;   }   @Override   public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   initPresnter();   //需要加载数据或者接收到界面点击事件时,调用presenter接口进行初始化或者响应。   mPresenter.loadDataList();   }   @Override   public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {   return inflater.inflate(R.layout.fragment_data_list, container, false);   }   @Override   public void showDataList(List<String> data) {   //将数据传给adapter等数据展示的视图   }   }   public class DataListPresenter implements DataContract.DataListPresenter {   private DataContract.DataListView mView;   public DataListPresenter(DataContract.DataListView view) {   super();   this.mView = view;   }   @Override   public void loadDataList() {   //调用baseview的接口,这些接口实现在baseFragment或者BaseActivity中   mView.showLoading();   //getdata from network   mView.stopLoading();   mView.showDataList(Arrays.asList("a","b","c"));   }   }   上述代码中有很多可以好好思考的地方。首先是 showLoading 和 stopLoading 这两个函数。这两个函数接口定义在 BaseView ,实现在 BaseFragment ,所以当 DataListFragment 继承了 BaseFragment 并且实现了 BaseView 时,它并不需要再次定义上述两个接口,毕竟在一个app中,网络加载时的laoding动画一般都是一致的。然后是view和presenter之间函数调用的问题。首先,view在需要初始化或者需要处理点击事件时,需要调用presenter的函数,而不是自己来进行处理。而且二者之间的数据传递必须是presenter调用view的接口传递给view数据,而不是view调用presenter接口获得数据然后自己展示。


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯