一步一步的实现Android的mvp框架

叁歲伎倆 2022-09-24 14:21 326阅读 0赞

使用android的框架,首先我们应该了解,使用框架的目的。框架最终的目的就是增强项目代码的可读性,维护性和方便测试。

要解决这三个问题,核心思想就是两种,一种是分层,一个是模块化。两个方法的目的就是为了解耦。

640_wx_fmt_png_tp_webp_wxfrom_5_wx_lazy_1

mvc框架,简单的来理解就是,Activity或者Fragment直接与数据层交互,activity通过api Provider进行网络访问,或者通过cache provider读取本地缓存,然后再返回或者回调里对Activity的界面进行相应刷新。

我们做一个一个设想,加入一次数据访问可能需要同时访问api和cache,或者一次数据请求需要请求两次api。对于activity来说,它即与界面的展示,事件等有关系,又与业务数据层有着直接的关系,无疑activity层会急剧膨胀,变得极难阅读和维护。在这种结构下,activity同时承担了view层和controller层的工作,所以我们需要给activity减负。

mvp的网络层次模型:

640_wx_fmt_png_tp_webp_wxfrom_5_wx_lazy_1 1

看一个简单的小例子,如下所示。

  1. public class MainActivity extends Activity implements MainView{
  2. MainPresenter presenter;
  3. TextView mShowTxt;
  4. protected void onCreate(Bundle savedInstanceState){
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. mShowText=(TextView)findViewById(R.id.text1);
  8. loadDatas();
  9. }
  10. public void loadDatas(){
  11. presenter = new MainPresenter();
  12. presenter.addTaskListerer(this);
  13. presenter.getString();
  14. }
  15. @Override
  16. public void onShowString(String str){
  17. mShowTxt.setText(str);
  18. }
  19. }

Activity里面包含了几个文件,一个是View层的对外接口MainView,一个是P层Presenter。

首先对外接口MainView文件。

  1. public interface MainView{
  2. void onShowString(String json);
  3. }

Presenter层的文件如下。

  1. public class MainPresenter {
  2. MainView mainView;
  3. TaskManager taskData;
  4. public MainPresenter() {
  5. this.taskData = new TaskManager(new TaskDataSourceImpl());
  6. }
  7. public MainPresenter test() {
  8. this.taskData = new TaskManager(new TaskDataSourceTestImpl());
  9. return this;
  10. }
  11. public MainPresenter addTaskListener(MainView viewListener) {
  12. this.mainView = viewListener;
  13. return this;
  14. }
  15. public void getString() {
  16. String str = taskData.getTaskName();
  17. mainView.onShowString(str);
  18. }
  19. }

可以单刀Presenter层是连接Model层和View层的中间层,因此持有View层的接口和Model层的接口,这里就可以看到MVP的优势了。

DataManager.java

  1. <pre name="code" class="java">/**
  2. * 从数据层获取的数据,在这里进行拼装和组合
  3. */public class TaskManager {
  4. TaskDataSource dataSource;
  5. public TaskManager(TaskDataSource dataSource) {
  6. this.dataSource = dataSource;
  7. }
  8. public String getShowContent() {
  9. //Todo what you want do on the original data
  10. return dataSource.getStringFromRemote() + dataSource.getStringFromCache();
  11. }
  12. }

TaskDataSource.java文件

  1. /**
  2. * data 层接口定义
  3. */
  4. public interface TaskDataSource {
  5. String getStringFromRemote();
  6. String getStringFromCache();
  7. }

TaskDataSourceImpl.java文件

  1. public class TaskDataSourceImpl implements TaskDataSource {
  2. @Override
  3. public String getStringFromRemote() {
  4. return "Hello ";
  5. }
  6. @Override
  7. public String getStringFromCache() {
  8. return "World";
  9. }
  10. }

TaskDataSourceTestImpl.java

  1. public class TaskDataSourceTestImpl implements TaskDataSource {
  2. @Override
  3. public String getStringFromRemote() {
  4. return "Hello ";
  5. }
  6. @Override
  7. public String getStringFromCache() {
  8. return " world Test ";
  9. }
  10. }

从上面几个文件来看, TaskDataSource.java 作为数据层对外的接口, TaskDataSourceImpl.java 是数据层,直接负责数据获取,无论是从api获得,还是从本地数据库读取数据,本质上都是IO操作。 TaskManager 是作为业务层,对获取到的数据进行拼装,然后交给调用层。

发表评论

表情:
评论列表 (有 0 条评论,326人围观)

还没有评论,来说两句吧...

相关阅读

    相关 实现优雅重试

    重试的作用 对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。 远程调用超时、网络突然中断可以重试。在微服务

    相关 实现SpringIoc容器

    IoC(Inverse of Controll控制反转):指的是对象的创建方式进行了反转,传统的开发方式是程序员自己 new 对象,IoC就是将这一过程进行了反转,程序员不需要

    相关 iOS 如何搭建框架

    前言 本文参考casatwy先生的网络层架构设计从网络请求的构建到请求结果的处理为你概述如何构建一个方便易用的iOS网络层, 全文约8千字, 预计花费阅读时间20 - 30分

    相关 VINS来 | 框架

    VINS是视觉惯性结合的SLAM系统的典范,该系统也是中国人开发的,接下来很长一段时间小狼会带着你一步一步踏踏实实得走进VINS,走进VIO领域! 总的来说,VINS因为涉