为什么在调用我的 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
。
现在实际上我看到了一件奇怪的事情发生在我的 Splashscreen
的 ondestroy()
函数之前 我正在调用一个正在调用 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
,即您的 Activity
的 context
。
因此,由于 Notification service
引用了您的 Toast
视图,而 toast
视图引用了您的 Activity
,因此您的 Activity
没有根本就没有被摧毁。你的 Activity
漏水了。由于您的 Activity
尚未被销毁,因此即使在 onDestroy()
回调之后访问了 progressBar
,您也不会获得任何 NullPointerException
。
for 循环一直 运行 并且 Notification service
隐含地持有对您的 Activity
的引用。所以你的 Activity
没有机会被摧毁。
我有一个 android 应用程序,首先当用户打开我的应用程序时,我会显示 Splashscreen
,然后用户被导航到 HomeActivity
。
现在实际上我看到了一件奇怪的事情发生在我的 Splashscreen
的 ondestroy()
函数之前 我正在调用一个正在调用 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
,即您的 Activity
的 context
。
因此,由于 Notification service
引用了您的 Toast
视图,而 toast
视图引用了您的 Activity
,因此您的 Activity
没有根本就没有被摧毁。你的 Activity
漏水了。由于您的 Activity
尚未被销毁,因此即使在 onDestroy()
回调之后访问了 progressBar
,您也不会获得任何 NullPointerException
。
for 循环一直 运行 并且 Notification service
隐含地持有对您的 Activity
的引用。所以你的 Activity
没有机会被摧毁。