alertdialog旋转屏幕消失造成leak window
在activity里边创建AlertDialog并显示它,此时转屏,发现对话框会消失,Activity会被重新创建。
即:
onCreate -> onStart-> onResume ->旋转 -> onPause -> onStop -> onDestroy -> onCreate -> onStart -> onResume
效果看起来很好,但是从log,发现似乎发生溢出。
05-12 10:05:34.418 11242 11242 D TAG : getProp: unknown
05-12 10:05:34.442 11242 11289 D Surface : Surface::disconnect(this=0x71ce5cb000,api=1)
05-12 10:05:34.449 11242 11242 D View : [Warning] assignParent to null: this = DecorView@459eb07[MainActivity]
05-12 10:05:34.465 11242 11242 E WindowManager:
05-12 10:05:34.465 11242 11242 E WindowManager: android.view.WindowLeaked: Activity dsfingerprint.dy.txx.com.dsfingerprint.MainActivity has leaked window DecorView@687d778[MainActivity] that was originally added here
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.ViewRootImpl.<init>(ViewRootImpl.java:614)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.app.Dialog.show(Dialog.java:342)
05-12 10:05:34.465 11242 11242 E WindowManager: at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1009)
05-12 10:05:34.465 11242 11242 E WindowManager: at dsfingerprint.dy.txx.com.dsfingerprint.MainActivity.BtnOnClick(MainActivity.java:252)
05-12 10:05:34.465 11242 11242 E WindowManager: at java.lang.reflect.Method.invoke(Native Method)
05-12 10:05:34.465 11242 11242 E WindowManager: at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.View.performClick(View.java:7150)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.View.performClickInternal(View.java:7123)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.View.access$3500(View.java:807)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.view.View$PerformClick.run(View.java:27540)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.os.Handler.handleCallback(Handler.java:883)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.os.Handler.dispatchMessage(Handler.java:100)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.os.Looper.loop(Looper.java:214)
05-12 10:05:34.465 11242 11242 E WindowManager: at android.app.ActivityThread.main(ActivityThread.java:7554)
05-12 10:05:34.465 11242 11242 E WindowManager: at java.lang.reflect.Method.invoke(Native Method)
05-12 10:05:34.465 11242 11242 E WindowManager: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
05-12 10:05:34.465 11242 11242 E WindowManager: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
05-12 10:05:34.467 11242 11289 D Surface : Surface::disconnect(this=0x71d37ed000,api=1)
05-12 10:05:34.469 11242 11242 D View : [Warning] assignParent to null: this = DecorView@687d778[MainActivity]
原因是,AlertDialog需要依附于Activity而存在,此时Activity被销毁,AlertDialog却未被dismiss,导致其依赖的上下文不存在。无法回收。
05-12 10:28:25.159 13004 13004 D TAG : onPause: alertDialog.isShowing():true
05-12 10:28:25.165 13004 13004 D TAG : onStop: alertDialog.isShowing():true
05-12 10:28:25.169 13004 13004 D TAG : onDestroy: alertDialog.isShowing():true
05-12 10:28:25.182 13004 13057 D Surface : Surface::disconnect(this=0x71ce760000,api=1)
05-12 10:28:25.184 13004 13004 D View : [Warning] assignParent to null: this = DecorView@459eb07[MainActivity]
05-12 10:28:25.205 13004 13004 E WindowManager:
05-12 10:28:25.205 13004 13004 E WindowManager: android.view.WindowLeaked: Activity dsfingerprint.dy.txx.com.dsfingerprint.MainActivity has leaked window DecorView@687d778[MainActivity] that was originally added here
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.ViewRootImpl.<init>(ViewRootImpl.java:614)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.app.Dialog.show(Dialog.java:342)
05-12 10:28:25.205 13004 13004 E WindowManager: at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1009)
05-12 10:28:25.205 13004 13004 E WindowManager: at dsfingerprint.dy.txx.com.dsfingerprint.MainActivity.BtnOnClick(MainActivity.java:255)
05-12 10:28:25.205 13004 13004 E WindowManager: at java.lang.reflect.Method.invoke(Native Method)
05-12 10:28:25.205 13004 13004 E WindowManager: at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.View.performClick(View.java:7150)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.View.performClickInternal(View.java:7123)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.View.access$3500(View.java:807)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.view.View$PerformClick.run(View.java:27540)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.os.Handler.handleCallback(Handler.java:883)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.os.Handler.dispatchMessage(Handler.java:100)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.os.Looper.loop(Looper.java:214)
05-12 10:28:25.205 13004 13004 E WindowManager: at android.app.ActivityThread.main(ActivityThread.java:7554)
05-12 10:28:25.205 13004 13004 E WindowManager: at java.lang.reflect.Method.invoke(Native Method)
05-12 10:28:25.205 13004 13004 E WindowManager: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
05-12 10:28:25.205 13004 13004 E WindowManager: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
05-12 10:28:25.207 13004 13057 D Surface : Surface::disconnect(this=0x71ce930000,api=1)
05-12 10:28:25.209 13004 13004 D View : [Warning] assignParent to null: this = DecorView@687d778[MainActivity]
05-12 10:28:25.393 13004 13004 D TAG : onCreate:
05-12 10:28:25.408 13004 13004 D knealq : onResume: i:1
解决办法:
在销毁Activity之前,主动将Alertdialog dismiss。
protected void onPause() {super.onPause();if(null != alertDialog && alertDialog.isShowing()){Log.d("TAG", "onPause: alertdialog showing, dismiss it");alertDialog.dismiss();}}
再看log,不再报leak window了:
05-12 10:18:11.978 12708 12708 D TAG : getProp: unknown
05-12 10:18:11.979 12708 12708 D TAG : onPause: alertdialog showing, dismiss it
05-12 10:18:11.986 12708 12757 D Surface : Surface::disconnect(this=0x7170e7a000,api=1)
05-12 10:18:11.988 12708 12708 D View : [Warning] assignParent to null: this = DecorView@58f3ef1[MainActivity]
05-12 10:18:12.001 12708 12708 D TAG : onStop: alertDialog.isShowing():false
05-12 10:18:12.005 12708 12708 D TAG : onDestroy: alertDialog.isShowing():false
05-12 10:18:12.015 12708 12757 D Surface : Surface::disconnect(this=0x7170e45000,api=1)
05-12 10:18:12.018 12708 12708 D View : [Warning] assignParent to null: this = DecorView@ca42725[MainActivity]
05-12 10:18:12.167 12708 12708 D TAG : onCreate:
05-12 10:18:12.182 12708 12708 D knealq : onResume: i:1
05-12 10:18:12.183 12708 12708 D TAG : onAnimationUpdate: 0
05-12 10:18:12.184 12708 12708 D TAG : onResume: mExpandedFraction: 0.2737995
05-12 10:18:12.184 12708 12708 D TAG : onResume: getScreenWidth: 720
05-12 10:18:12.184 12708 12708 D TAG : onResume: getScreenHeight: 1461
05-12 10:18:12.184 12708 12708 D TAG : onResume: checkDeviceHasNavigationBar: true
05-12 10:18:12.185 12708 12708 D TAG : getNavigationBarHeight: 96.0
05-12 10:18:12.185 12708 12708 D TAG : onResume: getNavigationBarHeight: 96
05-12 10:18:12.186 12708 12708 D TAG : onResume: getStatusBarHeight: 43
05-12 10:18:12.186 12708 12708 D TAG : onResume: duijiao: 39.833196157492175
05-12 10:18:12.186 12708 12708 D TAG : onResume: duijiao2: 1754.5369759569046
05-12 10:18:12.191 12708 12708 V PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = null, this = DecorView@5d3fc27[]
05-12 10:18:12.196 12708 12708 D ViewRootImpl[MainActivity]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
05-12 10:18:12.202 12708 12708 V PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = android.view.ViewRootImpl@21d1372, this = DecorView@5d3fc27[MainActivity]
05-12 10:18:12.205 12708 12708 D TAG : onAnimationUpdate: 0
05-12 10:18:12.241 12708 12708 E GraphicExt: GraphicExtModuleLoader::CreateGraphicExtInstance false
05-12 10:18:12.243 12708 12757 D Surface : Surface::connect(this=0x716fb2d000,api=1)
05-12 10:18:12.245 12708 12757 D Surface : Surface::setBufferCount(this=0x716fb2d000,bufferCount=3)
05-12 10:18:12.246 12708 12757 D Surface : Surface::allocateBuffers(this=0x716fb2d000)
05-12 10:18:12.282 12708 12708 D TAG : onDismiss: androidx.appcompat.app.AlertDialog@cc2491f
05-12 10:18:12.294 12708 12708 D TAG : onAnimationUpdate: 6
05-12 10:18:12.330 12708 12708 I AssistStructure: Flattened final assist data: 2028 bytes, containing 1 windows, 10 views
05-12 10:18:12.333 12708 12708 D TAG : onAnimationUpdate: 12
05-12 10:18:12.360 12708 12708 D TAG : onAnimationUpdate: 20
alertdialog旋转屏幕消失造成leak window相关推荐
- iOS手动和自动旋转屏幕
1.手动旋转屏幕函数 - (void)setOrientation: (UIInterfaceOrientation)orientation {if([[UIDevice currentDevice] ...
- vue标签旋转_vue.js编写移动端页面,检测旋转屏幕,横竖屏。
初学vue,想要在检测到旋转屏幕后显示遮罩层. 现在我的想法是在mounted时期添加监听屏幕旋转事件,如果检测到了,则修改data中的值isShowCover来改变v-show中的真假值,来达到显示 ...
- ios 旋转屏幕试图切换_总结iOS App开发中控制屏幕旋转的几种方式
在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewControlle ...
- iphone横竖屏切换,旋转屏幕
http://www.cocoachina.com/bbs/simple/?t124992.html 1.用UINavigationController处理2个以上ViewController跳转时, ...
- android 旋转屏幕全屏,重新组合活动布局以在旋转屏幕时全屏播放video
在一个活动中,我嵌入了一个video窗口小部件(与SurfaceView相关联的VideoView或MediaPlayer),当旋转屏幕时,应调整其大小. 此活动用作TabHost中的内容. 我目前的 ...
- ios 旋转屏幕试图切换_iOS屏幕旋转及其基本适配方法
屏幕旋转示例.jpeg 前段时间抽空总结了一下iOS视频播放的基本用法,发现这其中还有一个我们无法绕过的问题,那就是播放界面的旋转与适配.的确,视频播放与游戏类型的App经常会遇到这个的问题.由于至今 ...
- Android 性能优化之旋转屏幕优化
我的博客原文地址 问题背景 在桌面转屏发现响应不够迅速,对比其他产品有很大的提升空间,针对此问题进行了一些分析和优化. 问题分析和解决方法 首先简单介绍一下旋转屏幕的流程,首先各个界面要进行重绘,在重 ...
- 通过优雅的方式强制旋转屏幕
谨慎能捕千秋蝉,小心驶得万年船 --<庄子语录> 前言 方向旋转在日常App上基本都会用到,用的时候可能会因为赶工期而以实现功能为主,认真思 ...
- 解决Flutter旋转屏幕状态栏空缺的问题
问题 最近要实现一个视频播放器,全屏播放时需要旋转屏幕,把案例拿出来试了一下,旋转屏幕后呈现的状态是这样 解决办法 打开项目下android/app/src/main/res/values/style ...
最新文章
- 这是一份不完整的数据竞赛年鉴!
- 蜗杆单轨滑轨的驱动的统一接口
- 絮语----工作四年的碎碎念
- 多模态理论张德禄_结构动力学中的模态分析(3) —— 模态参数及实验模态分析...
- xutils找id空指针_xUtils更新到3.0后的基本使用规则
- 《花开在眼前》听得泪流满面
- 在线高精度在线计时器(秒表)
- 设置窗体的可见性无效
- ipa 上传卡在鉴权_Application Loader上传app,一直卡在“正在通过 App Store 进行鉴定”...
- 服务器登记信息查询,勤哲Excel服务器数据查询
- 警惕!ADSL远程盗号竟如此简单(转)
- 比特率与波特率的区别
- 【Unity】Button基础-按钮更换图片样式
- Unity3D Delegate
- 计算机专业该如何找实习工作?迷茫、不知所措的你值得一看~
- 传奇世界开服教程:传奇世界开服需要准备什么?前期需要投入多少?
- Excel 2010 VBA 入门 033 批量合并相同的单元格
- VUE项目的e2e自动化测试超详细安装过程(保姆级)
- 华科计算机保研复试题目,2010华科保研复试经验谈
- 好丽友玩转线下营销,移动派屋亮相五一小长假