`
byandby
  • 浏览: 1694069 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android ProgressDialo异常 no dialog with id 0 was ever shown via Activity#showDialog

阅读更多
  公司的项目今天测试登录的时候出现一个问题。 验证用户名 还有密码 这个过程是通过 AsyncTask 异步完成的, 当用户登录的时候会弹出一个ProgressDialog 如下图:

图片加载中..........

大家可以看到屏幕中央有一个ProgressDialog 提示正在验证账户,验证的过程是通过一个异步任务来完成的,但是如果这时我不停的点击Back键--》一定要不停的点,就会抛出一个异常,异常见下图。



  这个异常的意思就是说没有一个 id为0的dialog 已经通过 showDialog()方法显示了。出现这个异常的原因是:当我们点击Back键的时候ProgressDialog 其实已经被结束了,它在当前的那个 Activity已经不存在了,然而后台的AsyncTask任务其实还在继续执行 。。然后我们又在onPostExecute() 方法取消显示这个Dialog,但是 这个时候 这个dialog已经没了啊,因为当我们点击Back键的时候 就会结束那个Dialog!! 找不到它了 所以抛出了这个异常。

   解决办法就是 设置那个Dialog的onCancel事件,并且在onCancel方法里边判断 如果那个AsyncTask任务对象不等于null ,就结束它,代码片段如下。
private AccountVerifyAsyncTask mAccountVerifyTask;


if(mAccountVerifyTask == null || mAccountVerifyTask.getStatus() == AsyncTask.Status.FINISHED || mAccountVerifyTask.isCancelled()){
			mAccountVerifyTask = (AccountVerifyAsyncTask) new AccountVerifyAsyncTask().execute(username,password);
		}


class AccountVerifyAsyncTask extends AsyncTask<String ,Integer, Integer>{
		
		@Override
	    protected void onPreExecute() {
			showDialog(VERIFY_DIALOG_KEY);
	    }


		@Override
		protected Integer doInBackground(String... params) {
			String username = params[0];
			String password = params[1];
			int result = AccountManager.instance().accountVerify(username, password);
			return result;
		}
		
		@Override
		protected void onPostExecute(Integer result) {
			dismissDialog(VERIFY_DIALOG_KEY);
			int code = result;
			AccountManager.instance().handleVerifyResult(code);
			if(AccountManager.SUCCESS == code){
				AccountManager.QUERY_CANCELED = false;
				onAccountChanged();
			}
		}
	}

  
switch(id){
		case VERIFY_DIALOG_KEY: {
			final ProgressDialog dialog = new ProgressDialog(this);
			dialog.setMessage(getResources().getString(R.string.account_verify_account));
			dialog.setIndeterminate(true);
			dialog.setCancelable(true);
			dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
				
				@Override
				public void onCancel(DialogInterface dialog) {
					if(mAccountVerifyTask != null){
						mAccountVerifyTask.cancel(true);
					}
				}
			});
			//mVerifyDialog = dialog;
			return dialog;
		}


  • 大小: 46.2 KB
  • 大小: 31.3 KB
分享到:
评论
1 楼 droid_dfh 2012-04-12  
这样判断不行吗,if(dialog != null && dialog.isShowing){
                    dialog.dismiss();
}

相关推荐

    Android Dialog风格的Activity

    在Android开发中,Dialog风格的Activity是一种特殊类型的窗口,它以对话框的形式展现,通常用于显示临时信息或者需要用户进行简单交互的场景。本项目是一个使用Android Studio编写的示例,实现了将一个Activity以...

    Android 控制关闭Dialog

    在Android开发中,Dialog是一种常见的用户交互元素,用于在用户界面中显示临时信息或进行简单的交互操作。通常,当我们使用AlertDialog构建一个对话框时,它的默认行为是在用户点击按钮(如"确定"或"取消")后自动...

    Android 悬浮Activity ( Dialog风格)

    在Android开发中,"悬浮Activity"通常指的是一个可以悬浮在其他应用之上,类似Dialog样式但功能更为丰富的Activity。这样的设计可以提供用户一种便捷的方式访问或操作应用,而无需完全退出当前正在使用的应用。悬浮...

    Android 底部弹出dialog+动画

    在Android开发中,底部弹出Dialog是一种常见的交互方式,它用于显示临时信息或者提供用户一些简短的操作选项。本文将详细讲解如何实现一个带有动画效果的底部弹出Dialog,并通过具体的代码实例进行演示。 首先,...

    各种android弹出dialog效果以及各种dialog样式

    各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果以及各种dialog样式各种android弹出dialog效果...

    android dialog输入框获取数据

    ### Android Dialog 输入框获取数据详解 #### 一、前言 在Android开发中,Dialog(对话框)是一种非常常见的UI组件,它可以帮助开发者快速构建出弹出式对话窗口,用于与用户进行简单交互,比如提示信息、确认操作...

    完美实现将activity作为dialog弹窗进行弹出

    在Android开发中,有时我们可能需要将一个Activity展示为Dialog样式,以便于用户交互,比如在主界面之上显示一个半透明、大小可调整的小窗口。本文将深入探讨如何完美实现将Activity作为Dialog弹窗进行弹出,并且...

    自定义Dialog(Activity样式改为Dialog)

    在Android开发中,有时我们需要创建一个对话框式的效果,但又希望它具备Activity的功能和扩展性,这时可以将Activity的样式改为Dialog。本教程将详细讲解如何实现自定义Dialog(Activity样式改为Dialog)。 首先,...

    Android中使用Dialog风格弹出框的Activity

    在Android开发中,`Dialog`风格的`Activity`是一种常见的用户界面设计,它模拟了系统对话框的效果,用于展示临时信息或需要用户进行简单交互的情景。这种风格可以使应用程序的界面更加美观,用户体验更佳。下面我们...

    android 自定义dialog和activity跳转的样式

    在Android开发中,自定义Dialog和Activity的跳转样式是提升用户体验和应用独特性的重要手段。自定义Dialog可以使应用程序在提示用户信息或者进行选择时,展现出更符合应用风格的界面,而自定义Activity跳转样式则能...

    Android Dialog全屏显示、动画显示

    在Android开发中,自定义Dialog是一种常见的用户交互方式,它能提供更为丰富的界面和功能,以满足特定场景下的需求。本教程将详细讲解如何创建一个全屏显示且带有动画效果的自定义Dialog,并结合相机和图片选择的...

    Android 对话框(Dialog)大全

    ### Android对话框(Dialog)大全详解 #### 一、概述 Android中的对话框是一种常见的用户界面元素,用于在应用中向用户展示重要的信息或获取用户的反馈。Android提供了多种类型的对话框,包括但不限于警告对话框、...

    Android-dialog库可以在任意类内调用子线程或ui线程内均可显示

    在Android应用开发中,对话框(Dialog)是一种常见的用户交互元素,用于向用户展示临时信息、请求确认或者提供选项。标题提到的“Android-dialog库”是Android开发中的一个第三方库,它提供了一种灵活的方式,使得...

    android自定义精美的dialog

    在Android开发中,自定义对话框(Dialog)是提升用户体验和增强应用个性化的重要手段。一个精美的自定义Dialog不仅能够提供必要的信息,还能通过各种显示动画效果吸引用户的注意力,增加应用的趣味性和专业性。本篇...

    Android高仿IOS的Dialog效果

    本教程将详细介绍如何在Android中创建一个高度仿iOS风格的Dialog效果。 一、Dialog基础知识 Dialog是Android系统中一种重要的UI组件,用于在用户与主屏幕交互时显示临时信息或进行简单的决策。它浮现在应用窗口之上...

    Android Dialog中加载GIF

    在Android开发中,有时我们需要在Dialog中展示动态内容,如GIF动图,来提供更丰富的用户交互体验。本文将详细讲解如何在Android Dialog中利用Glide库加载并播放GIF。 首先,Glide是一个非常流行的Android图片加载库...

    Android Dialog更改样式及显示位置

    在Android开发中,Dialog是一种常见的用户交互界面,用于在主线程中显示临时信息或进行简单的用户操作。默认情况下,Dialog会出现在屏幕中央,但开发者可以根据需求自定义其样式和显示位置。本文将深入探讨如何在...

    Android五种显示Dialog的方法实现

    在Android开发中,Dialog是一种非常常见的用户界面组件,它用于在主界面之上显示临时信息或者进行简单的交互。本文将详细讲解五种不同的方法来在Android应用中实现Dialog,并结合源码进行解析。 1. **AlertDialog**...

    Android_对话框(Dialog)大全

    `dismissDialog()`会关闭指定ID的对话框,而`removeDialog()`除了关闭对话框外,还会移除Activity对对话框的引用,防止内存泄漏。 5. **对话框样式和主题**:可以通过设置对话框的主题(Theme)来自定义其外观,如...

Global site tag (gtag.js) - Google Analytics