2010-05-17 79 views
5

在Android應用程序中,我在單獨的線程中運行任務。在線程運行時,它會在主窗口中更新進度條,以便讓用戶知道發生了什麼。問題是,如果用戶第二次啓動線程,則不會重置進度欄。它只會坐在100%沒有做任何事情。當第二次打開時,ProgressBar不會重置爲「0」

整體來源是available on github。以BackupThreadJsonBackup(主類)爲例。請注意,「RestoreThread」顯示相同的行爲,但我認爲在這兩種情況下問題都是相同的。

在通過一個快速步行:

在各地line 300 in JsonBackup.java,我打開一個新的ProgressDialog。由於這是一個新的實例,我假設所有的都已正確初始化。在我目前的工作副本上,我添加了一行將進度設置爲「0」,但這並沒有改變任何內容。在同一個塊中,我創建備份線程並運行它。

下一個感興趣的代碼是線程將其進度傳回主應用程序的時刻。這發生在line 185 of BackupThread.java左右。

消息在line 80 of JsonBackup.java中處理,它將更新進度條。

到目前爲止的代碼演練。在寫這篇文章的時候,有一件事讓我印象深刻的是line 87 of JsonBackup.java。我認爲如果線程發送了不同的消息,明確表示已完成,那將是最好的。但我認爲這不是真正的問題。我這樣說是因爲一旦達到100%,進度對話框就會自行解散。

因此,如果這整個事情運行一次,一切都按預期工作。現在假設用戶離開應用程序,但操作系統決定將其保存在內存中。稍後用戶回來並想要創建新的備份。然後,該應用程序將無法正常工作,因爲進度一直保持在100%。如果你殺了應用程序,所以它完全卸載它將再次工作。所以我假設一些對象實例仍然在內存中,並且在重新運行時具有不清潔的狀態。但是對於我的生活,我無法找到正在發生的事情。作爲一個切線,我可能會補充:除了記事本教程外,這是我的第一個Android應用程序,以及bla di blah blah ...

我在這裏缺少什麼......?

+0

只是爲了解釋更多像我這樣的人,如果您在Asynctask中使用進度欄,則可以將進度對話框的進度設置爲onPostExecute函數爲零以便下次使用。 – Behzad 2013-04-12 13:10:29

回答

4

Dialog獲得緩存Activity,這是預期的行爲。
選項包括:

  1. 覆蓋onPrepareDialog(..)再次顯示它
  2. 自己管理的對話框中,手動調用show()之前重置它的狀態
  3. 呼叫removeDialog(..)dismiss()

我經常去#1經常使用Dialog s和#3爲罕見的。

+0

謝謝。這使我走上了正確的軌道。 – exhuma 2010-05-17 22:39:31

1

我通常使用onCreateDialog()加上onPrepareDialog()來管理對話框。

From dev guide on android developers:

定義onCreateDialog(int)和onPrepareDialog(INT,對話框)回調方法,最好的方法是,檢查則傳遞到方法id參數的switch語句。每種情況都應檢查唯一的對話ID,然後創建並定義相應的對話框。

onCreateDialog()方法在第一次創建對話框時調用一次;在這裏放置初始化對話框的代碼。

onPrepareDialog()方法在每次顯示對話框時被調用。

它提供了一個機會,在顯示 之前,準備 託管對話框。重寫這個,如果你需要 更新基於應用

的 狀態管理對話框的對話框時必須關閉您可以:

如果您正在使用onCreateDialog(INT) 管理你的對話框 的狀態(如前面的 節討論),那麼您的每一次對話 被駁回,對話框 對象的狀態是由活動保留。如果 您決定不再需要 需要此對象或它的重要 該狀態被清除,那麼您應該調用removeDialog(int) 。此 將刪除該對象的任何內部引用,並且如果對話框顯示爲 ,則會將其解除。

相關問題