2017-12-27 12 views
1

ich ein Bild Download mit Firebase Lagerung auf diese Weise:OnComplete nach Aktivität Zerstörung in FirebaseStorage genannt

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

Und fügte ich einen Zuhörer zu wissen, wann der Download beendet:

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

Das Problem tritt auf, wenn ich das Internet entferne, versuche, das Bild herunterzuladen und die Aktivität zu zerstören. Der Aufruf sollte zerstört werden, da die Aktivität zerstört wird, jedoch bleibt sie gespeichert. In der Tat, wenn ich das Internet aktiviere, wird die Methode onComplete aufgerufen, obwohl die Aktivität zerstört ist. Diese letzte ist nicht erstellt, ich habe alle mit Protokollen überprüft. Also wie kann ich den Anruf definitiv unterbrechen? Und warum wird die Methode aufgerufen?

+0

Ihre Methode aufgerufen wird, weil Sie eine starke Erinnerung Bezug auf 'Activity' Objekt in einem anderen Thread zu halten, die es wie„Vollendung Hörer behandelt ". Es ist auch ziemlich schlecht für die Erinnerung, weil Aktivität nicht Müll gesammelt wird. Sie sollten Aktivitäten von Listenern entfernen, wenn diese zerstört sind. –

Antwort

1

Betrachten Sie die StorageReference.html#getFile Methode verwendet, so dass Sie einen kündbaren FileDownloadTask zu bekommen.

Lassen Sie uns sagen Sie Ihre Anrufe in onCreate() machen anrufen und in der onDestroy() Methode abbrechen möchten,

/** 
* 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(); 
} 

Weitere Informationen in der Dokumentation hier:
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

Hoffnung das hilft.

2

Die Aufgabe API hat Ihre Rückseite: Verwenden Sie die addOn[...]Listener(Activity, On[...]Listener) Varianten. Dann wird der Listener automatisch in der Methode onStop() der Aktivität entfernt. Für Ihren Fall würde es so aussehen:

...addOnCompleteListener(this, this); 

Hier ist die documentation.

Verwandte Themen