Firebase Android: 如何取消下载?

5

我该如何从Firebase取消我的下载任务?

我想在点击ProgressDialog之外的任何地方时取消下载。

这是我的下载活动ExamesActivity.java的部分内容。它看起来像:

//Download the File on Button(Download) click:
        bDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Initalizing teh Spinner-to-String functions:
                Grade = spClasse.getSelectedItem().toString();
                Type = spEpoca.getSelectedItem().toString();
                Subject = spDisciplina.getSelectedItem().toString();
                Year = spAno.getSelectedItem().toString();

                //Download the File:
                //First Check if ON the Spinner, everything is choosen. It should be. If not, show error Toast.
                if (Grade.equals("...") | Type.equals("...") | Disciplina.equals("...") | Year.equals("..."){

                    //Show the The Error Toast:
                    Toast.makeText(ExamesActivity.this, "everything shall be choosen", Toast.LENGTH_SHORT).show();

                } else {                                          //What the dir would look like: "Subject/Grade/Year-Type.extension"
                    pdfRef = mStorageRef.child(Subject + "/" + Grade + "/" + Year + "-" + Type + ".pdf");
                    File root = android.os.Environment.getExternalStorageDirectory();
                    File dir = new File(root.getAbsolutePath() + "/Exams-App/");

                    //Show the ProgressDialog while downloading:
                    progressDialog.show();

                    if (!dir.exists()) {
                        dir.mkdirs();
                    }

                    localFile = new File(dir, Subject + "-" + Year + "-" + Grade + "-" + Type + ".pdf");


                    pdfRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                            // Local temp file has been created
                            progressDialog.dismiss();
                            Toast.makeText(ExamesActivity.this, "Exam was successfully downloaded!️",  Toast.LENGTH_SHORT).show();
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception exception) {
                            // Handle any errors
                            progressDialog.dismiss();
                            Toast.makeText(ExamesActivity.this, "Exam not found on the server.", Toast.LENGTH_LONG).show();
                        }

                    }).addOnProgressListener(new OnProgressListener<FileDownloadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(FileDownloadTask.TaskSnapshot taskSnapshot) {
                            //Some math to get the Percentage of the Download :)
                            double progressPercentage = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                            double size = (taskSnapshot.getTotalByteCount()) / (1000000);
                            progressDialog.setMessage("PDF Size: " + (size) + " - " + ((int) progressPercentage) + "% - Click away to cancel the download.");

                        }
                    });
                }
            }
        });
2个回答

4

pdfRef.[getFile][1](localFile) 返回一个 FileDownloadTask 对象。这个对象是 CancellableTask 的一个子类,它有一个 cancel() 方法。你需要持有对这个任务的引用,并调用它的 cancel 方法来取消下载。


还有没有办法取消 getMetadata 调用?它返回 com.google.android.gms.tasks.Task,因此没有可用的 cancel() 方法。 - Jozef

0
这是我实现的解决方案:
OnProgressListener 中,我创建了一个 _storageTask 变量,类型为 StorageTask 并存储快照的 task。同时,将该变量设置为全局可访问。
....
StorageTask _storageTask; //global variable
..... 
 .addOnProgressListener(snapshot -> { _storageTask = snapshot.getTask()});
....

>> 创建了一个名为cancelUploading()的方法,可以在需要时调用以取消上传过程。

private void cancelUploading()
{
    //Cancel the uploading process to the firebase storage.
    _storageTask.cancel();
    _storageTask.addOnCanceledListener(() -> Toast.makeText(AssignAnnounceActivity.this, "Uploading", Toast.LENGTH_SHORT).show());
}

注意:每当您需要取消上传过程时,都可以使用该方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接