首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在自定义对话框dismiss()之后调用finish()时,Android活动崩溃

在自定义对话框dismiss()之后调用finish()时,Android活动可能会崩溃。这是因为dismiss()方法是异步执行的,即使对话框已经消失,活动仍然在继续执行。当调用finish()方法时,活动会尝试销毁自身,但由于dismiss()方法尚未完成,活动可能无法正确处理销毁过程,从而导致崩溃。

为了避免这种崩溃,可以使用Handler来延迟调用finish()方法,以确保dismiss()方法已经完成。具体步骤如下:

  1. 在活动中创建一个Handler对象。
代码语言:txt
复制
private Handler mHandler = new Handler();
  1. 在dismiss()方法之后调用finish()方法的地方,使用postDelayed()方法来延迟调用finish()。
代码语言:txt
复制
dialog.dismiss();
mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        finish();
    }
}, 100);

上述代码中的100表示延迟的时间,单位为毫秒。可以根据实际情况进行调整。

这样做的原理是通过Handler将finish()方法的调用放入消息队列中,等待一段时间后执行。这样可以确保dismiss()方法已经完成,避免活动崩溃。

需要注意的是,这种解决方案只适用于在dismiss()之后立即调用finish()的情况。如果存在其他异步操作,需要根据具体情况进行处理。

推荐的腾讯云相关产品:无

希望以上信息能对您有所帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

项目中有个Activity中用到了ProgressDialog,而在跳转到下个Activity就会报这个错: has leaked window com.android.internal.policy.impl.PhoneWindow...Context context) {         super(context);         initFormats();     } 这样就可以理解为什么跳转时会提示这个错误了,我finish...dismiss方法会释放对话框所占的资源,而hide方法不会。activity退出前必须调用dismiss方法关闭对话框。...所以,最正确的调用方法是,activity的onDestory方法里调用dismiss方法,其他地方都用hide方法隐藏对话框。...现在问题清楚了,就是如果你创建AlertDialog的时候调用了setOnCancelListener 这个mCancelMessage变量有作用,否则dismiss和cancel等同。

51120
  • 浅谈 Android 自定义锁屏页的发车姿势

    Android 5.0 之后引入了 Material Design,状态栏和导航栏也玩出了更多花样。...ACTION_USER_PRESENT广播是系统锁屏解锁广播,当系统锁屏页解锁就会触发。如果在接收到这一广播,将自定义锁屏页finish掉,就能避免指纹解锁成功后自定义锁屏页仍然显示的问题。...但是细心的读者会发现这种解法逻辑上还存在问题,因为在用户没有设置锁屏密码的情况下,前文自定义锁屏页onCreate()设置的FLAG_DISMISS_KEYGUARD标志位能够轻易解锁系统的锁屏页...NOTIFY_USER_PRESENT是自定义广播,用来通知锁屏页Activity调用finish方法。   ...而如果设置了锁屏密码,FLAG_DISMISS_KEYGUARD必然无法解锁系统锁屏,到达不了上述代码块,也不会finish。这样就避免了自定义锁屏页刚创建出来就将自己finish掉的困境。

    3.9K91

    Android常用对话框大全——Dialog「建议收藏」

    今天就来谈谈开发中经常用的到的一个控件——Dialog,对话框一般我们就用来提示一些信息给用户, 让用户自主选择,或者一些操作不可逆的情况下我们提示用户是否继续操作, 下面就让我们一起来学习吧。...所以可以看出对话框使用了一个建造者模式调用函数的时候就可以一直直点点点链式调用。...六:完全自定义对话框 上面我们说了可以通过调用.setView(view)方法,自定义其显示的内容;但是你会觉得这远远不够我还想把他的标题或者底部按钮给改了,那么就需要来个完全自定义了,如下:...首先我们需要自定义Dialog的style,让他自己本有的东西全部透明,然后设置我们自己的内容就可以达到完全自定义的效果了。... 接下来就可以为对话框设置我们自定义的style了. /** * 自定义对话框 */ private void customDialog() {

    3.5K30

    浅谈Android自定义锁屏页的发车姿势

    Android 5.0 之后引入了 Material Design,状态栏和导航栏也玩出了更多花样。...ACTION_USER_PRESENT广播是系统锁屏解锁广播,当系统锁屏页解锁就会触发。如果在接收到这一广播,将自定义锁屏页finish掉,就能避免指纹解锁成功后自定义锁屏页仍然显示的问题。...但是细心的读者会发现这种解法逻辑上还存在问题,因为在用户没有设置锁屏密码的情况下,前文自定义锁屏页onCreate()设置的FLAG_DISMISS_KEYGUARD标志位能够轻易解锁系统的锁屏页...NOTIFY_USER_PRESENT是自定义广播,用来通知锁屏页Activity调用finish方法。...而如果设置了锁屏密码,FLAG_DISMISS_KEYGUARD必然无法解锁系统锁屏,到达不了上述代码块,也不会finish。这样就避免了自定义锁屏页刚创建出来就将自己finish掉的困境。

    2.3K80

    Android系统对话框使用详解(最详细)

    实际应用开发中,用到系统对话框中的情况几乎是没有的。按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的。...即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现。 目录 ? 一、系统对话框的几种类型与实现 项目的实际开发中,用到的系统对话框几乎是没有的。...实际项目开发中,此类型对话框中用到的地方要比其他类型的对话框多一些。...2、普通对话框(多按钮) 系统对话框中最多出现三个按钮,即PositiveButton(确定)、NegativeButton(取消)、NeutralButton(忽略)。 运行截图: ?...,不过项目几乎上都是自定义对话框… 运行截图: ?

    2.3K30

    Android开发笔记(六十六)自定义对话框

    下面是Dialog的常用方法: Dialog构造函数 : 可定义对话框的主题样式(样式styles.xml中定义)。如是否有标题、是否为半透明、对话框的背景等等。...isShowing : 判断对话框是否显示。 show : 显示对话框。 hide : 隐藏对话框dismiss : 关闭对话框。...默认会自动关闭 getWindow : 获取对话框的界面对象。 其中getWindow方法是自定义对话框的关键,首先获取到对话框所在的界面对象,才能往这个界面上添加定制视图。...废话少说,直接上个自定义对话框的代码例子作为说明: import com.example.exmdialog.R; import android.app.Dialog; import android.content.Context..." /> 仿ios的滚轮对话框 自定义对话框费了许多口舌,现在说点正经的应用。

    2.5K20

    Android使用CardView实现圆角对话框

    前言:随着用户体验的不断的加深,良好的UI视觉效果也必不可少,以前方方正正的对话框样式APP已不复存在,取而代之的是带有圆角效果的Dialog,之前设置对画框的圆角效果都是通过drawable/shape...LoginActivity.class); startActivity(intent); UIUtil.toast("退出成功,请重新登录"); getActivity().finish...@Override public void onClick(View view) { mDialog.dismiss(); } }); mMessageBuilder...(dialogView); mDialog.setCanceledOnTouchOutside(false);//点击屏幕不消失 mDialog.show(); //设置参数必须在show之后...总结:CardView实现对话框的圆角效果更加的方便,不用编写shape属性,当标题栏需要背景色,也无需考虑设置标题栏的shape(不使用CardView,如果不使用shape设置背景色,会导致左上和右上不会变成圆角

    1.6K10

    Android AsyncTask完全解析,带你从源码的角度彻底理解

    继承我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下: 1. Params 执行AsyncTask需要传入的参数,可用于在后台任务中使用。 2....Android照片墙应用实现,再多的图片也不怕崩溃 这篇文章中例子的运行结果也证实了这个结论。...不过你可能还不知道,Android 3.0之前是并没有SerialExecutor这个类的,那个时候是直接在AsyncTask中构建了一个sExecutor常量,并对线程池总大小,同一刻能够运行的线程数做了规定...而线程池中最大能存放的线程数是128个,当我们尝试去添加第129个任务,程序就会崩溃。...因此3.0版本中AsyncTask的改动还是挺大的,3.0之前的AsyncTask可以同时有5个任务执行,而3.0之后的AsyncTask同时只能有1个任务执行。

    81750

    Android-浅谈广播机制,实现强制下线功能

    标准广播: 是一种完全异步执行的广播,广播发出之后,所有的广播接收器都会在同一间接收到这条广播消息,因此他们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。...有序广播: 是一种同步执行的广播,广播发出之后,同一刻只会有一个广播接收器能够接收到这条广播消息,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。所以此时的广播接收器是有前后顺序的。...而不必每个页面都编写一个弹出对话框的逻辑,因为你不知道用户此时在哪里。 强制下线的功能需要关闭所有活动,然后回到登录界面。...,注意这一定要调用 setCancelable() 方法将对话框设置为不可取消,否则用户点一下返回键就可以关闭对话框并据需使用程序了。...然后使用setPositiveButton()方法来给用户对话框注册确定按钮,当用户点击了确定按钮,就调用强制下线功能来销毁所有活动,并重新启动登录界面。

    90630
    领券