我的编程空间,编程开发者的网络收藏夹
学习永远不晚

AndroidMVP模式面向接口写法

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

AndroidMVP模式面向接口写法

首先我们需要知道mvp所代表的含义,m即model可以理解成用来获取数据和处理数据,v即view可以看成activity和fragment用来显示数据和处理交互,p即presenter可以理解成用来提供数据。

三者关系:m层用来获取数据然后将数据提供给p层,p层拿到数据后通过v层展示,其中m层和v层是不能直接进行交互的,通过p层这个桥梁进行交互。这其中p层会持有v层和m层的引用。(先读懂)

理解上面的说法下面我们直接上手代码:

为了减少接口文件我们可以把接口都声明在Contract内

public interface ContentContract {
    interface Model {
    }
    interface View {
    }
    interface Presenter {
    }
}
//这样我们不需要写三个接口文件

然后分别实现三个接口与之对应的m层,v层,p层

//model
public class ContentModel implements ContentContract.Model {
}
//view
public class MainActivty extends BaseQuickActivty implements ContentContract.View {
}
//presenter
public class ContentPresenter implements ContentContract.Presenter {
}

首先我们需要考虑的是在v层我们需要做一些什么处理,然后在定义我们的方法。假如我们需要获取首页的banner数据,这时候就可以在view中声明一个方法用来接收banner数据。

public interface ContentContract {
    interface Model {
    }
    interface View {
    void getBanner(String str);
    }
    interface Presenter {
    }
}
//这时候activity实现此方法
public class MainActivty extends BaseQuickActivty implements ContentContract.View {
    @Override
    public void getBanner(String  str) {
    }
}

当v层已经有了接收数据的方法时,那么数据从何而来了?我们在之前说过m层是用来获取数据的 所以我们可以在m层中定义一个请求网络的方法。

//
public class ContentModel implements ContentContract.Model {
      //获取banner
     public void sendHttpBannerData(OnListener<String> on){
          //这里需要考虑一个问题,就是每次获取请求后的数据,我们需要传递给p层,所以需要一个回调处理
          //我们可以对m层进一步封装下
          //代码示例  
          okgo.post().ex(new CallBack(){
             public void onSucces(String str){
                    on.onSuccess(str);
              }
              public void onFail(){
                     on.onFail();
              }
             });
   }
}
//封装后的modle层  ,先提取一个基类BaseModel
public interface BaseModel<T> {
    interface OnListener<T> {
        void onSuccess(T t);
        void onFail(int code, String msg);
    }
}
//modle实现
 interface Model<T> extends BaseModle<T> {
    }

现在数据获取的方式已经有了,那怎么传递给p层呢?我们在之前也说过p层会持有m层的引用,所以我们可以在p层中调用层方法。

public class ContentPresenter implements ContentContract.Presenter {
    private ContentModel mModel;
    private ContentContract.View mView;
    //当初始化的时候  同时持有v层和m层引用
    public ContentPresenter(ContentContract.View m) {
        mView=m;
        mModel = new ContentModel();
    }
    //定义一个send方法,在该方法中调用m层的请求数据方法
     public void send(){
           mModel.sendHttpBannerData(new BaseModel.OnListener<String>() {
               @Override
               public void onSuccess(String s) {
                    //这里就可以直接使用v层方法处理数据,在v层中我们已经实想该函数
                    mView.getBanner(s);
               }
               @Override
               public void onFail(int code, String msg) {
               }
           });
    }
}

最后一步就是初始化p

public class MainActivty extends BaseQuickActivty implements ContentContract.View {
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化p
        ContentPresenter contentPresenter = new ContentPresenter(this);
        contentPresenter.send();//调用p层的send方法 开始请求数据
    }
    @Override
    public void getBanner(String  str) {
    }
}

这样我们就可以交互了,在接口中我们可以根据自己的需求增加方法,可以提供基类,这样没必要每次都重写方法,可以将一些通用的放在基类中。(可以先消化下,接下来我们做进一步的处理和避免内存泄漏问题)

我们分析下不足之处。

每一个presenter都需要每次重写相同代码,手动释放p等不足之处。所以我们先从presenter入手.


public abstract class BasePresenter<T> {
    //弱引用 
    private WeakReference<T> mWeakReference;
    private ReferenceQueue<T> mReferenceQueue = new ReferenceQueue<>();
    
    public void attachView(T t) {
        mWeakReference = new WeakReference<T>(t);
    }
    public T getView() {
        return mWeakReference.get();
    }
    
    public boolean isViewAttachecd() {
        return mWeakReference != null && mWeakReference.get() != null;
    }
    
    public void deleteAttach() {
        if (mWeakReference != null) {
            mWeakReference.clear();
            mWeakReference = null;
        }
    }
}

接着我们改进activity或者fragment的基类base

**
 * activity 基类
 * v 代表 view
 * t presenter
 */
public abstract class BaseQuickActivity<V, T extends BasePresenter<V>> extends AppCompatActivity {
    protected T mPresenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = createPresenter();
        //这里做一下非空判断 有可能某些模块不需要mvp模式
        if (mPresenter != null) {
            mPresenter.attachView((V) this);
        }
    }
    protected abstract T createPresenter();
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mPresenter != null) {
            mPresenter.deleteAttach();
        }
    }
}
//fragment 一样的写法

这样我们基本上完善了mvp模式。mvp给我带来的好处很多,高度解耦,代码结构清晰(以前ac或者ft可以达到上千行代码,现在都交给了p和m),便于测试(不会)。但是同时也有缺点,第一感知就是类增多了。第二感知就是在交互时有些时候不方便。
上述结构体还是可以更加完善的,可以用eventbus或者rxjava用于沟通的桥梁和数据分发。

到此这篇关于Android MVP模式的写法浅析的文章就介绍到这了,更多相关Android MVP模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

AndroidMVP模式面向接口写法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

AndroidMVP模式面向接口写法

这篇文章主要介绍了AndroidMVP模式面向接口写法,MVP模式也出来好几年了,很成熟所以也导致写法有很多种,google提供了多种mvp模式,但我今天只讲解最简单的面向接口,需要详细了解可以参考下文
2023-05-20

C++云编程:面向对象方法与设计模式

面向对象方法和设计模式在 c++++ 云编程中的作用面向对象编程 (oop) 通过封装、继承和多态增强了 c++ 云应用程序的可伸缩性、可维护性和可重用性。设计模式提供经过验证的解决方案,用于解决常见问题,例如:观察者模式:用于云日志记录,
C++云编程:面向对象方法与设计模式
2024-05-12

设计模式辅助编写面向对象代码的实用指南

设计模式是解决常见代码问题的预定义解决方案,分为创建型(创建对象)、结构型(组合类)、行为型(定义对象交互)三类。例如,工厂方法模式(创建型)定义创建对象的方法,但将实例化委托给子类。这种模式允许客户端只指定所需的产品类型,而无需了解其创建
设计模式辅助编写面向对象代码的实用指南
2024-05-10

为什么我们倾向使用 Golang 接口来模拟方法

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《为什么我们倾向使用 Golang 接口来模拟方法》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学
为什么我们倾向使用 Golang 接口来模拟方法
2024-04-04

进入CentOS字符界面及窗口模式的方法

在CentOS界面切换问题中,也许很多人习惯进入字符工作方式来进行操作。那么如何切换到字符工作方式呢?下面我们就来介绍3种方法来进入字符工作方式:一起去看看吧! 在图形环境下开启终端窗口进入字符工作方式。在系统启动后直接进入字符工作方式。使
2022-05-22

建立云服务器端口连接模式设置方法

1.了解云服务器端口连接模式在建立云服务器的过程中,设置端口连接模式是非常重要的一步。端口连接模式决定了云服务器与外部网络之间的通信方式。常见的端口连接模式有以下几种:公网访问:允许云服务器通过公网IP地址与外部网络进行通信。内网访问:只允许云服务器与同一私有网络内的其他资源进行通信,无法通过公网IP地址访问。混合访问
建立云服务器端口连接模式设置方法
2023-10-28

如何建立云服务器端口连接模式设置方法

一、云服务器的端口连接模式云服务器的端口连接模式可以分为以下几种:公共端口:公共端口指的是所有服务器都可以访问的端口,比如HTTP/HTTPS、FTP、Telnet等。在这种端口连接模式下,所有服务器都可以通过公共端口进行连接,而其他用户只能访问特定的服务器。私有端口:私有端口指的是只有服务器自己可以访问的端口,比如S
如何建立云服务器端口连接模式设置方法
2023-10-27

Win7 数学输入面板直接用手写复杂公式的方法

在日常工作中,难免会遇到输入公式的问题,写作科技论文更是经常遇到公式。虽然Office中带有公式编辑器,但输入公式时仍然需要经过多个步骤的选择,总是不那么方便,如android果能够直接手写复杂的公式,那就方便多了。如果你使用的是Windo
2023-05-25

Win8开机跳过开始直接进入传统桌面模式的方法

默认情况下,Win8启动后会自动进入Windows8“开始”界面,不过由于和之前习惯差距较大,这项设计自始至终就一直被网友们所诟病。正所谓惹不起躲得起,如果你实在受不了微软的“专横”,不妨关注
2022-06-04

SQLServer 错误 7308 因为 OLE DB 访问接口“%ls”配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。 故障 处理 修复 支持远程

详细信息 Attribute 值 产品名称 SQL Server 事件 ID 7308 事件源 MSSQLSERVER 组件 SQLEngine 符号名称 RMT_STA_DISABLED 消息正文 ...
SQLServer 错误 7308 因为 OLE DB 访问接口“%ls”配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。 故障 处理 修复 支持远程
2023-11-05

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录