Android开发:浅谈MVP模式应用与内存泄漏问题解决

最近博主开始在项目中实践MVP模式,却意外发现内存泄漏比较严重,但却很少人谈到这个问题,促使了本文的发布,本文假设读者已了解MVP架构。

MVP简介

M-Modle,数据,逻辑操作层,数据获取,数据持久化保存。比如网络操作,数据库操作

V-View,界面展示层,Android中的具体体现为Activity,Fragment

P-Presenter,中介者,连接Modle,View层,同时持有modle引用和view接口引用

示例代码
Modle层操作

public class TestModle implements IModle{ private CallbackListener callback; public TestModle(CallbackListener callback) { this.callback = callback; } public interface CallbackListener { void onGetData(String data); } public void getData() { new Thread() { public void run() { callback.onGetData("返回的数据"); } }.start(); } }

View层

// 抽象的view层 public interface TestViewInterf extends IView { void onGetData(String data); } // 具体的View层 public class MainActivity extends Activity implements TestViewInterf{ private TestPresenter mTestPresenter; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // view层将获取数据的任务委派给中介者presenter,并传入自身实例对象,实现TestViewInterf接口 mTestPresenter = new TestPresenter(this); mTestPresenter.getData(); } @Override public void onGetData(String data) { // View层只做数据展示 showToast(data); } private void showToast(String toast) { Toast.makeText(this, toast, Toast.LENGTH_LONG).show(); } }

Presenter中介者

public class TestPresenter implements IPresenter{ IModle modle; IView view; public TestPresenter(IView view) { this.view = view; } public void getData() { // 获取数据的操作实际在Modle层执行 modle = new TestModle(new CallbackListener() { public void onGetData(String data) { if (view != null) { view.onGetData(data); } } }); modle.getData(); } }

根据OOP思想,Java应面向接口编程,这样才能给符合OCP原则。上述示例代码省略了更加抽象的接口IModle,IView,IPresenter,并且实际MVP实践中通常会引入泛型使其更具扩展性。

Google已提供了相关示例代码,并在MVP中增加了一个约束者:Contract,它的作用是定义各个模块的MVP接口。
google MVP sample code:https://github.com/googlesamples/android-architecture

内存泄露问题

由上可见,Presenter中持有View接口对象,这个接口对象实际为MainActivity.this,Modle中也同时拥有Presenter对象实例,当MainActivity要销毁时,Presenter中有Modle在获取数据,那么问题来了,这个Activity还能正常销毁吗?

答案是不能!

当Modle在获取数据时,不做处理,它就一直持有Presenter对象,而Presenter对象又持有Activity对象,这条GC链不剪断,Activity就无法被完整回收。

换句话说:Presenter不销毁,Activity就无法正常被回收。

解决MVP的内存泄露

Presenter在Activity的onDestroy方法回调时执行资源释放操作,或者在Presenter引用View对象时使用更加容易回收的软引用,弱应用。

比如示例代码:
Activity

@Override public void onDestroy() { super.onDestroy(); mPresenter.destroy(); }

Presenter

public void destroy() { view = null; if(modle != null) { modle.cancleTasks(); } }

Modle

public void cancleTasks() { // TODO 终止线程池ThreadPool.shutDown(),AsyncTask.cancle(),或者调用框架的取消任务api }

个人总结

因为面向MVP接口编程,可适应需求变更,所以MVP适用于比较大的项目;因为其简化了Activity和Fragmnt的职责,可大大减少View层的代码量,比起MVC中Activity,Fragment动不动上千行的代码量,简直优雅!

做完以上操作,由于MVP引起的内存泄露就差不多解决了,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-30 04:26:08

Android开发:浅谈MVP模式应用与内存泄漏问题解决的相关文章

网站建设:浅谈颜色模式

浅谈颜色模式 你有没有这种感觉,一幅色彩生动亮丽的图象通过彩色喷墨打印机打印出来,颜色变得灰暗难看,尽管打印机是高质量输出?不过在你责备你的打印机之前,我想问一问,你的图象是什么颜色格式? "颜色就是颜色,还有什么格式?" 是的,颜色也存在着各种格式. 打开你的Photoshop,看看Image菜单下的Mode项,里面有一长串的名字,那些都是什么?让我们慢慢道来. RGB颜色模式 我们每天面对的显示器便是根据这种特性,由RGB组成颜色.这就是RGB颜色模式的基础. 显示器是通过发射三种

取消耳机模式-android 开发如何关闭耳机模式

问题描述 android 开发如何关闭耳机模式 5C 在开发一个类似360智键,可是发现当接听电话的时候,处于耳机模式.说话对方听不到,对方说话,我们也听不到.想问一下如何取消耳机模式.感激不尽 解决方案 参考:http://download.csdn.net/detail/yyz81/4889448 解决方案二: 可以使用代码强制切换到听筒模式

浅谈js 闭包引起的内存泄露问题

  这篇文章主要介绍了浅谈js 闭包引起的内存泄露问题的相关资料,需要的朋友可以参考下 在js闭包中,可以定义"局部变量",但是外部去调用的话,尤其是反复调用赋值,会造成内存的大量开销.如何防止这种现象的发生?关于闭包还有没有类似的内存或效率问题需要注意?如何去规避? 内存问题可能是如下原因造成: 1. 循环引用导致了内存泄漏 2. 由外部函数调用引起的内存泄漏 避免内存泄漏 1. 打破循环引用 2. 添加另一个闭包 3. 避免闭包自身 以上所述就是本文的全部内容了,希望大家能够喜欢.

android开发时,什么时候会出现内存溢出?

问题描述 android开发时,什么时候会出现内存溢出? 在使用MediaPlayer时,出现内存溢出,导致程序异常退出,不知道是哪里出问题了. 解决方案 在开发图像,音频,视屏等应用中容易出现的问题就是内存溢出,需要妥善使用和管理内存. 1.尽量避免创建不必要的对象,提高对象的复用 2.减少将大量数据放入对象中,使用完后及时销毁 解决方案二: 加载图片不当的处理的时候会出现内存溢出,内存溢出其实是Java的回收机制没来得及回收那些没有被调用的对象引起的,一般加载图片时候,去读缓存····还有就

Android 开发手机(三星)拍照应用照片旋转问题解决办法

Android 开发手机(三星)拍照应用照片旋转问题解决办法 最近解决了一个令我头疼好久的问题,就是三星手机拍照图片旋转的问题,项目中有上传图片的功能,那么涉及到拍照,从相册中选择图片,别的手机都ok没有问题,唯独三星的手机拍照之后,你会很清楚的看到会把照片旋转一下,然后你根据路径找到的图片就是已经被旋转的了,解决办法终于被我找到了.我们可以根据图片的路径读取照片exif(Exchangeable Image File 可交换图像文件)信息中的旋转角度 根据调试,可以清楚的发现三星手机拍照的图片

Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解

前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学习一下如何解决RxJava引起的内存泄漏,就查到了利用Rxlifecycle开源框架可以解决,今天周末就来学习一下如何使用Rxlifecycle. 引用泄漏的背景: RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格.易用易读的链式方法调用.强大的异步支持等使得R

Android开发中的MVP架构

最近越来越多的人开始谈论架构.我周围的同事和工程师也是如此.尽管我还不是特别深入理解MVP和DDD,但是我们的新项目还是决定通过MVP来构建. 这篇文章是我通过研究和学习各种文章以及专题讨论所总结出来的,它包括以下几点: 为什么越来越多的人开始关注架构? 首先,MVP是什么? 哪种架构才是最好的,MVC,MVVM还是MVP? MVP的利与弊 Show me the code!!!代码展示 不幸的,这篇文章将不包括: 详细生动的代码示例 如何编写测试代码 最后,我将告诉你如何更进一步学习这些专题.

浅谈MVP与Model-View-ViewModel(MVVM)设计模式

微软的WPF带来了新的技术体验,如Sliverlight.音频.视频.3D.动画--,这导致了软件UI层更加细节化.可定制化.同时,在技术层面,WPF也带来了 诸如Binding.Dependency Property.Routed Events.Command.DataTemplate.ControlTemplate等新特性.MVVM(Model-View-ViewModel)框架 的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架

Android开发之文件操作模式深入理解_Android

一.基本概念 复制代码 代码如下: // 上下文对象 private Context context; public FileService(Context context) { super(); this.context = context; } // 保存文件方法 public void save(String filename, String fileContent) throws Exception { FileOutputStream fos = context.openFileOut