在使用ProgressDialog作为网络加载数据的请求过程中,当数据加载完成,笔者很自然的将ProgressDialog调用了hide()方法,在当前activity退出时,遇到问题了android.view.WindowLeaked: Activity com.xxx.xxx.hangup.ProgressDialogActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{dd0bacf G.E...... R.....I. 0,0-684,0} that was originally added here
这个问题是说当前dialog所依附的activity被销毁,dialog依然存在,未被销毁。这真是平时使用api时,没怎么注意的结果呀。调用hide()方法是可以实现dialog的隐藏,但是dialog对象并未销毁。
下面是一个简单的测试这种异常代码

public class ProgressDialogActivity extends Activity {private ProgressDialog pd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//创建一个ProgressDialog,并执行show()方法pd = new ProgressDialog(this);pd.setMessage("在activity中showdialog后,直接退出activity异常");pd.setTitle("dialog异常测试");pd.show();}@Overrideprotected void onResume() {super.onResume();//暂时在onResume()中掉了dialog的hide()方法,然后我们执行手机back键,会发现异常log/*** 01-01 02:37:26.845: E/MultiWindowProxy(25617): getServiceInstance failed!01-01 02:37:30.569: E/WindowManager(25617): android.view.WindowLeaked: Activity com.xxx.xxx.hangup.ProgressDialogActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{dd0bacf G.E...... R.....I. 0,0-684,0} that was originally added here01-01 02:37:30.569: E/WindowManager(25617):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:460)01-01 02:37:30.569: E/WindowManager(25617):     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:306)01-01 02:37:30.569: E/WindowManager(25617):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.Dialog.show(Dialog.java:326)01-01 02:37:30.569: E/WindowManager(25617):     at com.xxx.xxxx.hangup.ProgressDialogActivity.onCreate(ProgressDialogActivity.java:25)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.Activity.performCreate(Activity.java:6301)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2523)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2658)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.-wrap11(ActivityThread.java)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1492)01-01 02:37:30.569: E/WindowManager(25617):     at android.os.Handler.dispatchMessage(Handler.java:111)01-01 02:37:30.569: E/WindowManager(25617):     at android.os.Looper.loop(Looper.java:207)01-01 02:37:30.569: E/WindowManager(25617):     at android.app.ActivityThread.main(ActivityThread.java:5741)01-01 02:37:30.569: E/WindowManager(25617):     at java.lang.reflect.Method.invoke(Native Method)01-01 02:37:30.569: E/WindowManager(25617):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)01-01 02:37:30.569: E/WindowManager(25617):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:685)*/if(pd != null){pd.hide();}   }
}

上面注释是异常log信息。

下面看下hide()和dismiss()方法的具体实现:
hide()源码实现如下:
/**
* Hide the dialog, but do not dismiss it.
*/
public void hide() {
if (mDecor != null) {
mDecor.setVisibility(View.GONE);
}
}

很明确的看到dialog是一个view视图,而hide()实现中只是将view设置为gone,并未移除。
dialog的dismiss()方法如下:

 /*** Dismiss this dialog, removing it from the screen. This method can be* invoked safely from any thread.  Note that you should not override this* method to do cleanup when the dialog is dismissed, instead implement* that in {@link #onStop}.*/@Overridepublic void dismiss() {if (Looper.myLooper() == mHandler.getLooper()) {dismissDialog();} else {mHandler.post(mDismissAction);}}

在看下dismissDialog内的实现:

 void dismissDialog() {if (mDecor == null || !mShowing) {return;}if (mWindow.isDestroyed()) {Log.e(TAG, "Tried to dismissDialog() but the Dialog's window was already destroyed!");return;}try {mWindowManager.removeViewImmediate(mDecor);} finally {if (mActionMode != null) {mActionMode.finish();}mDecor = null;mWindow.closeAllPanels();onStop();mShowing = false;sendDismissMessage();}}

看到了mWindowManager.removeViewImmediate(mDecor)的代码。
至此,dialog的view才被真正移除。
希望小伙伴们不要犯和我一样的low的错误。。。

ProgressDialog的hide()和dismiss()方法相关推荐

  1. fragment中的replace和hide与shou方法的区别

    在我们使用fragment去填充frame的布局的时候,有两个方法可供我们使用,一个是ft.replace(),另一种是使用hide()和shou()方法.这两个方法所产生的效果是有差别的,  使用f ...

  2. Dialog的Dismiss方法使用注意事项

    Dialog的Dismiss方法可以在主线程和子线程调用. 当在主线程调用时,系统其实会启动一个子线程做里面的耗时操作. 我们使用的时候,最好判断一下调用Dialog的Dismiss方法的Dialog ...

  3. jQuery(4)——jQuery hide、show方法的简单了解

    jQuery hide.show方法的简单了解 jQuery 效果- 隐藏和显示 jQuery 效果- 隐藏和显示 在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HT ...

  4. Android开发——diglog cancel与dismiss方法区别

    AlertDialog dismiss 和 cancel方法的区别 AlertDialog使用很方便,但是有一个问题就是:dismiss方法和cancel方法到底有什么不同? 今天有时间,看了看源码( ...

  5. html show指定显示什么,hide() 和 show() 方法来隐藏和显示 HTML 元素,toggle()取反

    语法: $(selector).hide(speed,callback); $(selector).show(speed,callback); speed隐藏/显示速度,可以取以下值:"sl ...

  6. android dismiss方法,Android编程之DialogFragment源码详解(一)注:对 dismissAllowingStateLoss()理解...

    DialogFragment是Fragment家族成员之一,如果你把它简单的理解成Dialog,那就错了.它的确可以做作dialog显示,还可以显示出自己定义的Dialog或者AlertDialog, ...

  7. magento 赠品_Excel高级用户的Excelerators赠品

    magento 赠品 Are you an Excel power user? Answer a few quick questions at the Excelerators Quiz site, ...

  8. Android Dialog总结

    #.概述 Android系统提供的所有对话框类都继承自Dialog类,一般用到的是AlertDialog. 系统本身提供了AlertDialog的一些样式.也提供了AlertDialog的一些子类Di ...

  9. has leaked window com.android.internal.policy.impl.PhoneWindow解决(Dialog.cancel、dismiss、hide区别)

    项目中有个Activity中用到了ProgressDialog,而在跳转到下个Activity时就会报这个错: has leaked window com.android.internal.polic ...

最新文章

  1. 创建,修改Table格式
  2. EdgeGallery — MEP — 系统架构
  3. Selenium常用方法及函数
  4. C语言经典例20-小球反弹高度问题
  5. PHP.ini修改配置下载上传文件大小
  6. rpm方式安装mysql-5.7.11
  7. ViewRoot:处理消息+WMS交互+控制DecorView
  8. Tomcat 6.0 简介
  9. 红橙Darren视频笔记 筛选View 属性动画 Adapter模式 组合动画AnimatorSet 观察者模式(对比Android ListView) 练习
  10. 用Windows XP自带的性能监视器测试瑞星2010性能(转)
  11. python课程第三周小结_python周报第三周
  12. anaconda安装torch_零基础入门PyTorch:怎样用?有哪些优势?手把手带你安装配置...
  13. sketchup 草图 大师 使用笔记
  14. 51Nod-1136 欧拉函数
  15. 生成3D多棱柱的方法(3D立体图片)
  16. 小巷开店问题(答案揭晓)
  17. 第三部分:成交动力学之十大成交激素——9、紧迫感
  18. 极海单片机串口调试记录
  19. JAVA 通过属性名称 获取属性值、设置属性值
  20. 央视气象女主播王蓝一揭秘天气预报潜规则

热门文章

  1. Html 3D旋转相册制作
  2. 解决JSONField标签失效
  3. 大模型 NLP 算法 大汇总
  4. 开通支付宝开发平台,实现支付宝支付,支付宝支付证书生成教程
  5. 流利阅读12.19 Victoria’s Secret gets ready for a makeover
  6. java+Springboot+vue漫画投稿交流网站源码介绍
  7. 为什么APM飞控装不上mission planner双旋翼三旋翼倾转旋翼机固件,不显示frame class 和bicopter以及apm飞控红黄绿颜色LED灯的含义
  8. Linux setenforce命令详解[SeLinux操作]
  9. 【2011集训队出题】拆迁队
  10. Python实现局部静态变量