2017-12-27 24 views
1

での活動の破壊の後に呼び出され、私はこの方法でFirebaseストレージを使用して画像をダウンロードしています: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... 
} 

この問題は、インターネットを削除してイメージをダウンロードし、アクティビティを破棄しようとしたときに発生します。アクティビティは破棄されますが、コールは保存されたままです。実際にインターネットをアクティブにすると、アクティビティが破棄されてもonCompleteメソッドが呼び出されます。この最後のはもう一度作成されたではありません。すべてログで確認しました。それでは、どうやってコールを確実に中断できますか?なぜメソッドが呼び出されますか?

+0

です"実際にはメモリにもかなり悪いです。なぜなら、アクティビティはガベージコレクションされないからです。リスナーが破棄されたときに、アクティビティーを除去する必要があります。 –

答えて

1

StorageReference.html#getFileメソッドを使用して、キャンセル可能なFileDownloadTaskを取得することを検討してください。

あなたがここにドキュメントで詳細情報

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

onCreate()であなたの呼び出しを行う呼び出し、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); 

ここであなたが完了リスナー」のようにそれを扱う別のスレッドで `Activity`オブジェクトへの強いメモリ参照を保持しているのであなたのメソッドが呼び出されdocumentation.

関連する問題