Android---MVP 中 presenter 声明周期的管理

2023-11-11 14:29

本文主要是介绍Android---MVP 中 presenter 声明周期的管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们经常在 Android MVP 架构中的 Presenter 层做一些耗时操作,比如请求网络数据,然后根据请求后的结果刷新 View。但是,如果按返回结束 Activity,而 Presenter 依然在执行耗时操作。那么就有可能造成内存泄漏,严重时甚至会造成程序崩溃。因为 Presenter 中的 View 已经变为 null。

为了解决这个问题,需要将 Activity 的某些生命周期方法与 Presenter 保持一致

Lifecycle 绑定 presenter 生命周期

Lifecycle 的使用很简单,Activity 通过继承 AppCompatActivity 会自动继承来自父类 ComponentActivity 的方法 getLifeCycle。具体如下

onStateChanged 方法会在 Activity 的生命周期发生变化时被触发,比如当我们打开 LoginActivity 时就会显示如下日志

当中 LoginActivity 界面按下返回键,则打印如下内容

Lifecycle 还提供了注解的方式使用,因此我们可以很容易创建一个接口 IPresenter。在这个接口中声明对各种 Activity 声明周期的回调,如下所示

上图中 IPresenter 接口通过注解的方式将 Activity 的声明周期绑定到相应的方法上。我们只需要在 BsetPresenter 中实现上述方法,并在方法中数据绑定与取消的操作即可,具体如下

注意:上图中代码存在一些问题,使用了 Android 中的 Log 来打印日志信息。严格来说,在 Presenter 层应该禁止出现任何 Android 中的类。这里为了快速演示效果,所以直接使用 Log 打印日志。

接下来,修改 LoginActivity,将 BasePresenter 注册到 LifeCycle 中即可,如下代码所示

从新打开 LoginActivity,显示日志如下

关闭 LoginActivity,显示日志如下

可以看出,当 Activity 执行 onDestory() 时,BasePresenter 的 onDestory() 方法也会被执行。

在 LoginActivity 方法中有 login() 方法,此方法会执行 BasePresenter 中的 login() 方法。如下代码

在 BasePresenter 中的 login() 方法中模拟执行了一段耗时操作。如果在 Activity onDestory() 时,BasePresenter 还没有处理完耗时操作,则会造成内存泄漏。 

解决办法就是在 BasePresenter 的 onDestory 方法中停止正在执行的耗时操作。如下所示

合理使用 Presenter 生命周期

并不是所有的 Activity 的生命周期都需要通知 Presenter。举个例子,假如我们需求是根据 GPS 定位,展示用户的位置。但是为了节省电量,有可能会在灭屏之后,解绑定 GPS 定位的接收事件。

如果使用 MVP 架构,需要有一个 TrackingActivity 实现 MVP 的接口 TrackingView,并在生命周期方法中调用 presenter 的相应方法。如下所示

TrackingPresenter 是 presenter 层的实现,内部实现了 GPS 定位的监听事件,并分别在 resume 和 stop 方法中绑定和解绑定 GPS。如下

上述写法是常规的 MVP 写法,但是存在两个问题:1)GpsTracker 实际的控制周期是跟 Activity 有关的,因为亮屏和灭屏事件是在 Activity 中接收的。中间多了一层 Presenter 层其实是多余的;2)从重构的角度看,TrackingPresenter 其实违反了职责单一原则(Single Responsibility)。因为 Presenter 层的主要作用是用来刷新 View,但是上述代码中的 TrackingPresenter 还负责对 GpsTracker 进行管理。

这种情况下,我们可以将 GpsTracker 初始化在 Activity 中,将 GpsTracker 的绑定与解绑定都在 Activity 中管理,最后将 GpsTracker 传给 TrackingPresenter 执行业务上的逻辑。具体实现如下

TrackingActivity 中对 tracker 进行管理,并且根据 Presenter 层的逻辑处理,回调 showCurrentPosition() 方法。

TrackingPresenter 

TrackingPresenter 只负责对 Gps 事件的监听并根据结果刷新 View。这样 View 层和 Presenter 层的职责单一原则就完咋。在完成实际需求的前提下,也丝毫不影响 Presenter 层的单元测试

当然,并没有绝对正确或错误的架构,说到底代码具体要怎样写、功能具体应该怎样实现,最终还是要看实际业务场景。

总结

主要对 MVP 架构中 Presenter 层的使用做了2点优化介绍:

1. 如何支持 Presenter 的生命周期,使其在 Activity 被销毁时也能取消相应的耗时请求。

2. 合理使用 Presenter 的生命周期,Activity 中所有的方法都委托给 Presenter 来处理是不合理的。这样会造成 Presenter 层极其庞大,也难以维护,有时也会违反职责单一原则。

这篇关于Android---MVP 中 presenter 声明周期的管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/390686

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式