Есть ли способ сделать этот звонок с переходами? - PullRequest
0 голосов
/ 03 октября 2018

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

 private void fetchUserLinks(){

        mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    String downloadURL= snapshot.child("URL_Files").child("URL_file_en").getValue(String.class);
                    downloadFile(downloadURL);


                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }


    private void downloadFile(String downloadURL) {
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageRef = storage.getReferenceFromUrl(downloadURL);

        File rootPath = new File(Environment.getExternalStorageDirectory(), "file_name");
        if(!rootPath.exists()) {
            rootPath.mkdirs();
        }

        final File localFile = new File(rootPath,"imageName.txt");

        storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Log.e("firebase ",";local tem file created  created " +localFile.toString());

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                Log.e("firebase ",";local tem file not created  created " +exception.toString());
            }
        });
    }

Теперь я думаю, что первый цикл получит URL-адрес загрузки файла первого потомка, отправит его из параметра в метод downloadFile, но пока метод downloadFile загружает или выполняет эту задачу асинхронноцикл for извлекает следующую ссылку и, возможно, отправляет ее методу до того, как она закончит извлечение и загрузку первой

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

спасибо

...