2017-12-27 279 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.