为什么在调用我的Activity的ondestroy之后我仍然看到来自同一个Activity的Toast被销毁

时间:2017-08-12 20:13:58

标签: android android-lifecycle

我有一个Android应用,首先当用户打开我的应用时,我会显示Splashscreen,之后用户导航到HomeActivity

现在实际上我看到一个奇怪的事情发生在我ondestroy()的{​​{1}}函数之前我正在调用一个函数调用Splashscreen并制作Toast但是事情是,我错误地在循环中调用了这个函数,所以发生的事情是我的Splashscreen ondestroy函数被调用,我的HomeActivity正在显示但是仍然会一次又一次地从Splashscreen显示Toasts。

现在我的问题是在销毁Splashscreen之后为什么android没有给我错误,因为我引用了绑定到Splashscreen的progressBar GONE所以它必须给我错误。

如果它不应该给我错误那么请告诉我在这里工作的概念是什么,我不知道。 我们在活动类中创建的所有变量都不会仅限于该活动,并且当该活动被销毁时也是如此 ??

我的启动画面功能代码如下所示,一次又一次地调用

Toast and ProgressBar

先谢谢。

2 个答案:

答案 0 :(得分:2)

我浏览了源代码,这是我的理论。

Toast在内部使用Service(通知服务)排队并显示Toast次观看。 Service在后​​台运行,其生命周期比任何Activity都长。

Notification Service引用了您使用Toast方法创建的makeText()视图。

Toast视图隐含引用了context Activity的{​​{1}}。

因为context引用了您的Notification service视图而Toast视图引用了您的toast,所以Activity没有被摧毁了。您的Activity正在泄露。由于您的Activity尚未销毁,即使在Activity回调后访问NullPointerException,您也无法获得任何progressBar

for循环一直在运行,onDestroy()隐含地保存对Notification service的引用。所以你的Activity没有机会被摧毁。

答案 1 :(得分:1)

吐司适用于应用的所有部分。 在您的代码中,您不会初始化存储Toast的变量。

解决方案怎么样。

我建议使用这样的东西:

private Toast toast;

private void function cancel() {
      if (toast != null)
            toast.cancel();
}
private void function showdialog() {
      toast = Toast.makeText(getBaseContext(), "Total Pending Notifications: " + pen_notifs, Toast.LENGTH_SHORT);
      toast.show();
      progressbar.setVisibility(View.VISIBLE);
}