为什么在调用我的 Activity 的 ondestroy 之后,我仍然看到来自被破坏的同一个 Activity 的 Toasts

Why after calling ondestroy of my Activity i am still seeing Toasts from that same Activity which is destroyed

我有一个 android 应用程序,首先当用户打开我的应用程序时,我会显示 Splashscreen,然后用户被导航到 HomeActivity

现在实际上我看到了一件奇怪的事情发生在我的 Splashscreenondestroy() 函数之前 我正在调用一个正在调用 Toast 并使 progressBar GONE 的函数但问题是,我在循环中错误地调用了这个函数,所以发生的事情是调用了我的 Splashscreen ondestroy 函数,我的 HomeActivity 正在显示,但仍然一次又一次地从 Splashscreen 显示 Toasts。

现在我的问题是,在破坏 Splashscreen 之后,为什么 android 没有给我错误,因为当我引用绑定到 Splashscreen 的 Toast and ProgressBar 时,它一定会给我错误。

另外,如果它不应该给我错误,那么请告诉我这里工作的概念是什么,我不知道。 难道我们在 activity class 中创建的所有变量都只绑定到 activity 并且当 activity 被销毁时它们也会被销毁 ??

我的 Splashscreen 功能代码 在下面给出,它被一次又一次地调用

public void function showdialog() {
      Toast.makeText(getBaseContext(), "Total Pending Notifications: " + pen_notifs, Toast.LENGTH_SHORT).show();
      progressbar.setVisibility(View.VISIBLE);
}

提前致谢。

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);
}

我查看了源代码,这是我的理论。

Toast 在内部使用 Service(通知服务)排队并显示 Toast 视图。 Service 在后台运行,其生命周期超过任何 Activity

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

并且 Toast 视图隐式引用了 context,即您的 Activitycontext

因此,由于 Notification service 引用了您的 Toast 视图,而 toast 视图引用了您的 Activity,因此您的 Activity 没有根本就没有被摧毁。你的 Activity 漏水了。由于您的 Activity 尚未被销毁,因此即使在 onDestroy() 回调之后访问了 progressBar,您也不会获得任何 NullPointerException

for 循环一直 运行 并且 Notification service 隐含地持有对您的 Activity 的引用。所以你的 Activity 没有机会被摧毁。