2016-09-11 78 views
6

我做了合理的研究,找不到我需要的答案。Android - Firebase - 我是否需要刪除每個單一的偵聽器?

我所知道的:當我附上ValueEventListener到數據庫的參考,我知道我需要在以後進行刪除(現在發現硬盤的方式與一些海量內存泄漏

我。不知道:我是否還需要卸下所有其他聽衆(這是包括火力地堡數據庫,存儲和驗證,這三個API的我使用)

例子:

UploadTask uploadTask = ref.putFile(uploadFile); 

uploadTask.addOnFailureListener(new OnFailureListener() { 
    //@Override code here 
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TakeSnapshot>() { 
    //@Override code here 
}).addOnProgressListner(new OnProgressListner<UploadTask.TakeSnapshot>() { 
    //@Override code here 
}; 

我認爲這足以向你展示我的意思。這是我的實際代碼目前的結構。

問題:

  1. 我是否需要刪除所有這些聽衆以防萬一 被終止的活動(系統決策,手機模具,等等)是 回調之前發生?
  2. 我可以將它們以某種方式捆綁在一起,並立即終止它們全部三個,因爲我有我的代碼中的30個這樣的代碼,真的不覺得 像重構所有它,以便將所有這些監聽器 分配給變量JUST所以我可以一遍又一遍地將它們傳遞給 「removeBlahBlahBlahListener(listenerVariable)」。
  3. 稍微偏離主題,但是,我懶得將我的所有代碼從 onCreate移到onStart ...對我來說是不好的練習,我可以刪除所有這些 聽衆,完成一切,調用finish()(或任何這是 殺死一個活動,但我想這不能保證),並從頭開始重新創建活動? 這是一個小的簡單的應用程序,所以重新創建活動 的開銷並不大。只是好奇什麼是「正確的」。

我想這只是由於計劃不周和缺乏知識(我只是爲了好玩而不是爲了工作而編程),所以如果我必須走艱難路線,我想這是一個學習體驗,對?

+1

我很困惑。您展示的示例代碼是Firebase Storage的進度監聽器。但是你的文本顯然是關於數據庫的。你有哪個問題? –

+1

對不起弗蘭克的困惑。我本可以更清楚。我正在使用來自Firebase的兩個API(數據庫和存儲),並且都有聽衆。我的問題確實是爲了適用於我所想的。我猜想一般Firebase聽衆以及他們做什麼時都不需要拆卸/移除。例如,有些FB監聽器在活動移出視圖時會自行處理,或者每個監聽器(數據庫和存儲)在onPause/Stop/Destroy之後都會繼續監聽。 – Ryan

回答

4

活動停止時自動取消註冊偵聽器是android及其派生類(StorageTask)中類「Task」的功能。

這意味着你可以做這樣的事情:

UploadTask uploadTask = ref.putFile(uploadFile); 

uploadTask.addOnFailureListener(thisActivity, new OnFailureListener() { 
//@Override code here 
}).addOnSuccessListener(thisActivity, new OnSuccessListener<UploadTask.TaskSnapshot>() { 
//@Override code here 
}).addOnProgressListner(thisActivity, new OnProgressListner<UploadTask.TaskSnapshot>() { 
//@Override code here 
}; 

您還可以使用任務做到這一點從實時數據庫中返回,如setValue方法爲對象:

databaseReference.setValue("newValue").addOnSuccessListener(thisActivity, ...) 

所以回答你直接提問:

  1. 使用活動範圍版本自動取消註冊活動中的聽衆停止。請注意,對於存儲,您可以在使用StorageReference開始活動時查詢正在運行的操作。getActiveUploadTasks和StorageReference.getActiveDownloadTasks並重新訂閱。

  2. 如果使用作用域偵聽器,則不需要手動取消訂閱。我不知道批量取消訂閱非基於任務的偵聽器的方法。

  3. 嗯,我不確定你如何保證操作系統總是會殺死你的任務,而不是再次停止/重新啓動 - 以及你的代碼將如何保證運行。我建議你將代碼移動到onStart

+0

太棒了!謝謝。優秀的答案和我正在尋找的信息。因此,在存儲示例中放置「thisActivity」的位置,是否與放置「this」或「this」描述活動以外的其他位置相同?我看到我可以做「this.getCallingActivity」等幾件事情。你能告訴我什麼是參考活動的正確方法,所以我最終不會引用別的東西嗎?另外,我會接受你的建議,並將onCreate()的一些邏輯移到onStart()。它應該在那裏開始。努力學習這門課! ;) – Ryan

+2

通常「this」是指活動內部代碼中的活動。但是,如果您處於嵌套類或回調例程中,它可能不會。如果你發現自己在那裏,你可以通過使用類型來限定「this」來具體引用該活動 - 就像在「MainActivity.this」 –

+0

中那樣,最後的評論只是把錦上添花。內存泄漏解決:) – Ryan

相關問題