Как возобновить загрузку файла в хранилище firebase?

Мне нужно загрузить большой файл с помощью хранилища Firebase, возможно, мой пользователь столкнулся с сетевым прерыванием загрузки, и я хотел бы иметь возможность возобновить эту задачу загрузки.

 FileDownloadTask downloadTask = firebaseStorage.getReferenceFromUrl(url).getFile(localFile);

    downloadTask.addOnProgressListener(new OnProgressListener<FileDownloadTask.TaskSnapshot>() {

        @Override
        public void onProgress(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Log.v(TAG, "progress" + taskSnapshot.getBytesTransferred());;
            }
    });

    downloadTask.addOnFailureListener(e -> {
        CustomLogger.v(TAG, "downloadTask, on Failed: " + courseId);
        deleteFilesAfterError(courseId);
    });

    downloadTask.addOnPausedListener(taskSnapshot
            -> CustomLogger.v(TAG, "downloadTask, on paused: " + courseId));

два последних слушателя никогда не вызываются. когда я настроил полный слушатель:

downloadTask.addOnCompleteListener()

мое приложение вылетает.

даже когда я настроил:

firebaseStorage.setMaxDownloadRetryTimeMillis(2000);

затем выключите мою сеть в середине загрузки, прослушиватель сбоев downloadTask не срабатывает. Кажется, что задача все еще выполняется, но данные не загружаются. Документация по этой функции плохая. как я должен это реализовать?

  • прослушиватель сбоев кажется сломанным
  • когда я добавляю completeListener, это приводит к сбою моего приложения
  • firebaseStorage.setMaxDownloadRetryTimeMillis, похоже, не имеет никакого эффекта

Любая идея о том, как решить функцию возобновления загрузки файла?


person drevlav    schedule 30.06.2016    source источник


Ответы (1)


Когда вы говорите, что отключаете сеть во время загрузки, как вы это делаете?

Причина, по которой я спрашиваю, заключается в том, что если вы временно покидаете действие, чтобы отключить сетевой поток, ваша проблема может быть проблемой жизненного цикла действия.

Если вы покинете действие и не обработаете это в onPause(), onStop() и т. д., вы можете столкнуться с таким поведением.

Кроме того, ваш код похож на документы (и мой код работает нормально), за исключением того факта, что вы не «связывали» свои методы для добавления слушателей (это не должно быть проблемой).

Однако ваш код, который вы скопировали и вставили сюда, частично свернут и не показывает, переопределяете ли вы метод onFailure(Exception e), но я предполагаю, что он свернут в этой стрелке.

Если вы все еще работаете над этим, можете ли вы опубликовать трассировку любых ошибок, которые вы получаете при сбое?

Вот блок кода, который работает во время сбоя сети, просто для справки:

FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageReference = storage.getReferenceFromUrl("gs://your-bucket/");

storageReference.getFile(localFile).addOnSuccessListener(YourActivity.this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {

                    }
                }
            }).addOnFailureListener(YourActivity.this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {

                }
            }
person Ryan    schedule 16.09.2016
comment
я больше не работаю над этим, этот код выполнялся в службе, поэтому не связывайте его с каким-либо жизненным циклом активности. Я выключался и входил в сеть, используя обычную кнопку на телефоне - person drevlav; 20.09.2016