Android开发dialog内存泄露,Android中导致内存泄漏的竟然是它----Dialog

article/2025/8/27 19:32:02

一. 内存泄漏的 Bug 猛增

最近在 App 进行 mokey 测试的时候检测到一些内存泄漏问题。在前天的测试中,楼主一瞬间收到了4个这样的 Bug 单,瞬间心理无比纠结,真有千万只羊驼向我奔来。

a926683b39836442288b806b7e5e1a32.png

登录页面出现内存泄漏??!!楼主的代码是如此的***而无懈可击,这么可能出现这么多泄漏的问题?

插播什么是 Activity 泄漏:Android 中 Activity 代表一个页面,拥有一段生命周期,生命周期结束后,Activity 对象应当在之后某个合适的时机被 VM 回收内存。出现了泄漏就意味着 Activity 生命周期结束后,VM发现 Activity 一直被持有,没有回收这些无用的内存。

按照以往的经验,大部分 Activity 泄漏的原因都是由于 Handler 内部类长时间挂在线程中导致的。而这块我们 App 已经考虑便处理了。究竟是哪泄漏了?

二. WebView 导致内存泄漏众所周知

带着怀疑的心态并且为了证明清白,我一个个点进去看了,总共有三条不同的引用链。为了后续说明,这里取了个名字:

① AuthDialog 引用链

597f219b27a4ccc67fef605506b4902e.png

② BrowserFrame 引用链

4269e662e3ab7cdf1051013faee8b4f8.png

③ IClipboradDataPaste 引用链

30448d274bbfc06c94578fe3a66d3cd1.png

看来这次情况有点不同!由于 Monkey 测试的机型比较少,这里所有的 Bug 都来自一部三星 GT-I9300@android+4.3 手机。

为了快速解决问题,楼主询问了其他同事和 StackOverflow,发现这其中有三个类 CookieSyncManager, WebView, WebViewClassic 已经被很多人提起过,它们会导致内存泄漏!初步有如下的结论如下:

1.CookieSyncManager 是个全局静态单例,操作系统内部使用了 App 的 Activity 作为 Context 构造了它的实例。我们应该在 App 启动的时候,抢先帮系统创建这个单例,而且要用 applicationContext,让它不会引用到 Activity。

530607b67a5a12f01bcab4f4ec53c38c.png

2.使用 WebView 的页面(Activity),在生命周期结束页面退出(onDestory)的时候,需要主动调用 WebView.onPause()以及 WebView.destory()以便让系统释放 WebView 相关资源。

b7c46c938320114597adf0fb089c0d06.png

4.WebView 内存泄漏是众所周知的,建议另外启动一个进程专门运行 WebView。不要9998,不要9999,我们要100%!WebView 用完之后就把进程杀死,即使泄漏了也无碍。

按照以上的种种结论,我们


http://chatgpt.dhexx.cn/article/WWKBtLZh.shtml

相关文章

dialog.setOnDismissListener(null)过程分析

前提 为解决DialogFragment的内存泄漏,使用了此篇博客的处理方法 DialogFragment 内存泄露,简单说就是给 dialog 设置 getDialog().setOnCancelListener(null); getDialog().setOnDismissListener(null);但发现了一个问题,当用户返回Activi…

深入分析Android中Dialog

在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构,通过它,可以总体对Dialog有一个很清晰的认识. 从这张图中可以看到,Dialog为父类, 其下有最重要的&#xf…

android自定义dialog去除title,Android 自定义Dialog去除title导航栏的解决方法

Android 自定义Dialog去除title导航栏的解决方法 如下所示: Dialog dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); 以上这篇Android 自定义Dialog去除title导航栏的解决方法就是小编分享给大家的全部内…

android常见的dialog的使用及认识

介绍 在实际开发过程中 , 我们难免要经常使用提示框 (dialog), 根据不同的场景使用不同的样式的提示框(dialog). androd提供了丰富的dialog函数 , 本文将介绍在实际开发中经常使用的对话框, 包括普通对话框 , 列表对话框 , 单选对话框 , 多选对话框 , 等待对话框, 进度条对话框…

ABAP屏幕设计Dialog

目录 一、概览 1.屏幕 2.程序组织 3.屏幕定义和维护 用途: 组成: Dialog的屏幕执行过程: 属性: 创建: 4.屏幕属性的动态修改 5.屏幕序列 二、Screen编程实例 1.Hello World屏幕编程 建立程序: 设计…

Android Dialog 源码研究

Android Dialog 源码研究 在阅读Dialog源代码之前,我给自己提出了4个问题,带着这4个问题的疑问,我才开始看源码,这样的好处能让阅读中有了侧重点,往往能更快的理解某些代码的意图,这也正是为什么总说提出问题本身,要比解决问题困难。 我下面要思考的4个问题是: Dialo…

android 判断dialog,Android 7.0经验谈:Dialog不显示之迷

最近遇到个怪问题,在其他手机上都能正常的显示Dialog,但是在Android 7.0的手机上只能显示Dialog的半透明背景,无法显示Dialog的内容。 用图给大家展示一个遇到的现象,正常时应该是这个样子的: 而我们遇到的情况如下,更坏的是如果我们设置Dialog不能点击空白处取消(dismis…

Android窗口设计之Dialog、PopupWindow、系统窗口的实现

窗口设计之Dialog、PopupWindow、系统窗口的实现 Android应用程序窗口设计系列博客: Android应用程序窗口设计之Window及WindowManager的创建 Android应用程序窗口设计之setContentView布局加载的实现 普法Android的Token前世今生以及在APP,AMS,WMS之间传递 Android应用程序窗口…

理解Android中Dialog

文章收藏的好句子:你能走多远、爬多高,不仅取决于你自身的力量,还取决于周围人带动的力量。 PS:本文是基于 Android Api 26 来分析源码的。 1、Dialog 的 Window 是在哪里创建的? Dialog 的 Window 是在什么地方创建的…

Android之Dialog分析

Android之Dialog分析 以Dialog为引导,Android的弹出式消息一共是三种(据我所知):Dialog,tocast,notification 其三种弹出式消息各有所长。今天重点是分析其中的Dialog。Android的Dialog是android界面编程的…

Android开发dialog内存泄露,Dialog引发的内存泄漏

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文是本人对于 LeakCanary 团队的一篇分析内存泄漏的文章的意译。水平有限,如有不够准确之处,敬请包涵。 主旨:在Lollipop之前的版本,Dialog可能导致内存泄漏。 引言 LeakCanary 提示存在内…

android源码分析-Dialog

今天给大家介绍android -Dialog源码分析 Dialog 是所有对话框的基类,例如AlertDialog,我们要深入了解指导Dialog的用法,逻辑,必须要把Dilaog弄清楚,下面首先我们来看下Google对Dialog的类描述:/**Base clas…

Dialog源码分析

1, 概述 Dialog(对话框)不仅可以显示信息,还可以和Activity界面进行交互,这种交互是阻塞式的. 继承Dialog的类有好几种,主要以AlertDialog为例来分析一下具体的原理。 2 实现 Dialog依附于Activity来实现,一般在acitivty中显示,因为Dialog的交互是阻塞式的,所以最好另开一线…

爬虫为什么会使用到HTTP代理?

在进行网页爬虫的时候使用HTTP代理,可以进行匿名抓取网页信息,爬取大数据等使用方向。HTTP代理我们很了解,但是你有了解过HTTP协议是什么吗? HTTP协议即超文本传输协议,是Internet上信息传输时使用最为广泛的一种简单…

爬虫笔记——全局代理下的requests写法

当PC挂了全局代理的时候,如果你的requests还像下面写的话,大概率会报错: 正确的写法是:

抓包:Android不走代理的请求

测试用例 测试应用有两个按钮,分别用 HttpURLConnection 和 Okhttp3 请求 https://www.baidu.com/。注意:两个请求都加入了 Proxy.NO_PROXY。 //HttpURLConnection请求https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel13812371237 public …

python爬虫——selenium+chrome使用代理

先看下本文中的知识点: python selenium库安装chrome webdirver的下载安装seleniumchrome使用代理进阶学习 搭建开发环境: selenium库chrome webdirver谷歌浏览器 >7.9 PS:安装了的同学可以跳过了接着下一步,没安装的同学跟…

python 爬虫 客户端_python爬虫

爬虫简介 什么是爬虫? 爬虫:就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单…

爬虫从入门到精通(7) | 常见反爬-代理IP的使用

目录 一、 为什么要使用代理IP? 二、代理IP的原理 三、代理IP的作用 四、代理IP的分类 ​ 1.根据代理的协议区分 2.根据匿名程度区分 五、在requests模块中如何设置代理 一、 为什么要使用代理IP? 使用自己本地的IP 利用爬虫技术获取某个网站信息的时…

爬虫手册06 代理池和代理服务器搭建

免费代理池的搭建 参考资料:Python3 网络爬虫开发实战(第二版) 一. 学习目标 : 参考《第9章 代理的使用》9.2节搭建自己私有的代理IP池。 二. 实验环境: 阿里云或腾讯云的服务器,我是在打折和新用户优…