我有一个Android应用,首先当用户打开我的应用时,我会显示Splashscreen
,之后用户导航到HomeActivity
。
现在实际上我看到一个奇怪的事情发生在我ondestroy()
的{{1}}函数之前我正在调用一个函数调用Splashscreen
并制作Toast
但是事情是,我错误地在循环中调用了这个函数,所以发生的事情是我的Splashscreen ondestroy函数被调用,我的HomeActivity正在显示但是仍然会一次又一次地从Splashscreen显示Toasts。
现在我的问题是在销毁Splashscreen之后为什么android没有给我错误,因为我引用了绑定到Splashscreen的progressBar GONE
所以它必须给我错误。
如果它不应该给我错误那么请告诉我在这里工作的概念是什么,我不知道。 我们在活动类中创建的所有变量都不会仅限于该活动,并且当该活动被销毁时也是如此 ??
我的启动画面功能代码如下所示,一次又一次地调用
Toast and ProgressBar
先谢谢。
答案 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);
}