我在某个活动中遇到了听众问题。
问题是这个侦听器包含一个alert.show();,在我们尝试推送一个新活动之后可以调用该侦听器(然后会出现异常)。
例如:我在Activity A中侦听来自另一部电话的信号。我按下返回键并尝试运行新Activity B,但由于alert.show()A的侦听器,程序崩溃。
ERROR/AndroidRuntime(3573): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@476c21c0 is not valid; is your activity running?
我是否可以在A的侦听器中检查此活动是否处于活动状态,然后根据此值是否显示警报?
9条答案
按热度按时间cgfeq70w1#
可能有一个更简单的方法,我想不出来,但有一个方法是自己实现它。在
onResume()
上,你设置一个成员变量mIsRunning
为true,在onPause()
上,你设置回false。使用这个布尔值,你应该知道不要在回调时调用alert.show()
。r1zhe5dt2#
这样,您就可以知道所指向的活动是否是当前可见的活动,否则您的警报将不会显示。
只有当我们在两个没有完成的活动之间导航时,这才起作用。
6kkfgxo03#
当后台线程完成其工作并尝试显示对话框时,“活动”将经历其销毁,此时会发生这种情况。
此异常很少重现,但当我们执行一些异步任务/后台操作,并希望显示一个带有Activity上下文的对话框,同时Activity由于某种原因正在自行销毁时,就会发生此异常。
Android OS应该可以处理这种情况,但截至目前还没有。
因此在调用对话框之前,只需检查Activity是否正在运行,而不是处于其销毁阶段。
gcmastyq4#
后台线程在完成其网络任务后,会在主线程上调用回调onSuccess()/onFailure()。如果此时,启动此后台线程任务的Activity不在前台,并且您尝试在onSuccess()/onFailure()中使用getActivity(),则会给予异常。因此,请尝试在执行任何UI操作之前添加此检查。
slsn1g295#
是,您可以检查活动是否处于活动状态:Refreshing an Activity from service when Active
此外,如果在“活动”处于非活动状态时未执行任何操作,则可能应该在“活动”停用时取消注册侦听器。
5jdjgkvh6#
对于API level〉= 23,你可以使用activity的'lifecycle'属性来检测activity的状态。这给出了一个非常紧凑的代码。下面是Kotlin中的一个示例代码,作为类扩展:
vohkndzv7#
我有两个活动A和B,我只是想知道活动B是否从A运行。
最初我遵循“RunningTaskInfo”解决问题,它不是100%工作.
所以我创建了自己的解决方案,我将张贴我的解决方案。使用HashMap和AtomicBoolean类。
}
现在在活动B中。
现在进入活动A。
......................................
这个解决方案在我的情况下工作正常。。我希望它对你也有帮助。
o2g1uqev8#
如果你不想在关闭活动后显示警报对话框或其他操作,请使用此代码。它工作100%准确。
z18hc3ub9#
当Activity被销毁,但未完成的业务逻辑仍在运行,并且当它完成时,其逻辑已准备好在UI中显示结果时,就会发生这种错误。例如,显示对话框窗口或显示后台任务的结果支持新旧Android版本,并避免兼容性问题以确定您的Activity是否仍在运行的最佳方法如下: