2017-08-12 33 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?你不覺得什麼時候活動被破壞,那麼我們不應該能夠調用任何活動的方法? –

相關問題