2017-08-12 36 views
2

我有一个Android应用程序,首先当用户打开我的应用程序时,我显示Splashscreen,之后用户导航到HomeActivity为什么在调用ondestroy我的活动后,我仍然看到从同一活动销毁的Toasts

现在实际上我看到一个奇怪的事情发生是在我Splashscreen我打电话被调用Toast,使progressBar GONE但事情是一个函数的ondestroy()功能,我错误地调用该函数在一个循环中,从而发生了什么是我的Splashscreen ondestroy函数被调用,我的HomeActivity正在显示,但仍然Toast从Splashscreen一次又一次地显示。

现在我的问题是在摧毁Splashscreen之后为什么android不会给我这个错误,因为我引用Toast and ProgressBar这是绑定到Splashscreen,所以它必须给我的错误。

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

闪屏功能代码下面这是越来越再次调用,并给出提前再次

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

感谢。

回答

2

我通过源代码去了,这是我的理论。

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

Notification ServiceToast视图有参考,您使用makeText()方法创建了视图。

Toast视图有对context的隐含引用,它是您的Activitycontext

如此以来,Notification service具有参考您Toast视图和toast视图有一个参考的Activity,你Activity并没有被破坏的。您的Activity泄漏。由于您的Activity尚未销毁,即使在回拨onDestroy()之后访问progressBar,您也没有收到任何NullPointerException

for循环已连续运行,并且Notification service隐含地指向您的Activity。所以你的Activity没有机会被破坏。

+0

Biut my onDestory()函数被调用? –

+0

我在日志中看到过 –

+0

是的,当'Activity'应该被销毁时,你的'onDestroy'会被调用。但是如果有其他生物体(在你的情况下为'Service')对你的'Activity'有强烈的参考,那'Activity'不能被垃圾收集。这就是所谓的活动泄漏。 – Bob

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

那么为什么当我调用'progressbar.setVisibility(View.VISIBLE);'我没有得到任何错误? –

+0

可见性状态只是一个布尔变量。它仅在渲染屏幕时使用。这是独立的循环。如果'progressbar'不是'null',则不会存在错误。 – Vyacheslav

+0

好吧,我甚至试图从那里调用Localbroadcast?你不觉得什么时候活动被破坏,那么我们不应该能够调用任何活动的方法? –

相关问题