В вашем коде много чего происходит, поэтому я сосредоточусь только на одной его части.
Проблема вызвана тем, что Firebase загружает файлы с сервера асинхронно.И пока файл загружается, вместо того, чтобы блокировать ваш код, он продолжает запускать ваш код.Поэтому, если вы не примете во внимание это асинхронное поведение, вы будете объединять файлы до того, как их данные действительно будут загружены.
Самый простой способ увидеть, что происходит, с помощью нескольких операторов журнала:
Log.i("Firebase", "Starting downloading from storage");
fileReference.getFile(file).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
Log.i("Firebase", "Download done");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.e("Firebase", "Download failed: "+exception.toString());
}
});
Log.i("Firebase", "After starting download from storage");
Если вы запустите этот код, вы получите:
Начало загрузки из хранилища
После начала загрузки из хранилища
Загрузка завершена
Это, вероятно, не то, что вы ожидали, но прекрасно объясняет, почему ваш код объединения не работает: данные, которые он хочет объединить, еще не доступны.
Решение состоит в том, чтобы изменить порядокв котором вы вызываете код.После завершения загрузки файла убедитесь, что это был последний файл.Если это так, начните объединение:
for (Iterator<TrackModel> i = trackList.iterator(); i.hasNext(); ) {
TrackModel item = i.next();
final StorageReference fileReference = mStorageRef.child("AudioRecords/" + item.fileName);
final File file = new File(Environment.getExternalStorageDirectory() + "/MueasycoDownloadedAudios/" + item.fileName);
fileReference.getFile(file).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
sizes[counter] = (file.length() - 44) / 2;
counter++;
if (counter == trackList.size()) {
Log.i("Firebase", "Downloads completed");
// TODO: merge the downloaded files here
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Log.e("Firebase", "Download failed: "+exception.toString());
}
});
}