2017-12-27 329 views
1

我下載以這種方式使用火力地堡存儲器中的圖像:的onComplete的活動破壞後稱爲FirebaseStorage

StorageReference storageReference = FirebaseStorage.getInstance().getReference(); 
storageReference.child("images/").child("myimage.jpg").getBytes(Long.MAX_VALUE).addOnCompleteListener(this); 

而且我添加了一個偵聽器,知道什麼時候下載完成:

@Override 
public void onComplete(@NonNull Task<byte[]> task) 
{ 
    //stuff... 
} 

當我刪除互聯網時,會出現問題,請嘗試下載圖像並銷燬活動。這個調用應該被銷燬,因爲這個活動被破壞了,但是它仍然被存儲。事實上,當我激活Internet時,儘管活動被破壞,onComplete方法仍被調用。這最後不是再次創建,我檢查所有與日誌。那麼我怎麼能打斷這個電話呢?爲什麼要調用這個方法?

+0

你的方法被調用,因爲你保留一個強大的內存引用'Activity'對象在另一個線程,它把它像「完成監聽器」。它對於內存來說確實非常糟糕,因爲活動不會被垃圾收集。當它被銷燬時,你應該從聽衆中移除活動。 –

回答

1

考慮使用StorageReference.html#getFile方法,以便您可以取消FileDownloadTask

比方說,你打電話讓你的來電中onCreate(),並希望在onDestroy()方法取消,

/** 
* reference to the download file task 
*/ 
FileDownloadTask downloadTask; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // get the StorageReference to the images folder 
    StorageReference storageReference = FirebaseStorage.getInstance().getReference().child("images/"); 
    // create the download file task 
    downloadTask = storageReference.getFile(new File("myimage.jpg")); 
    // this activity should also implement OnCompleteListener<FileDownloadTask.TaskSnapshot> 
    downloadTask.addOnCompleteListener(this); 
} 

@Override 
protected void onDestroy() { 
    if (downloadTask != null) { 
     downloadTask.cancel(); 
     downloadTask = null; 
    } 
    super.onDestroy(); 
} 

在文檔此處瞭解詳情:
https://developers.google.com/android/reference/com/google/firebase/storage/StorageReference
https://developers.google.com/android/reference/com/google/firebase/storage/FileDownloadTask
https://developers.google.com/android/reference/com/google/firebase/storage/FileDownloadTask.TaskSnapshot

希望這有助於。

2

任務API有你的背部:使用addOn[...]Listener(Activity, On[...]Listener)變體。然後,該活動的onStop()方法中的聽衆將被自動刪除。對於你來說,它應該是這樣的:

...addOnCompleteListener(this, this); 

這裏是documentation.