Получение метаданных - это асинхронная операция, которая происходит в фоновом режиме, пока ваш основной код продолжается. Проще всего увидеть, что это означает, добавив несколько простых операторов журнала:
reference.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult listResult) {
for(final StorageReference item : listResult.getItems()) {
Log.i(TAG, "Before calling getMetadata()");
item.getMetadata().addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
@Override
public void onSuccess(StorageMetadata storageMetadata) {
Log.i(TAG, "Got metadata");
}
});
Log.i(TAG, "After calling getMetadata()");
}
}
})
При запуске этот код печатает:
Перед вызовом getMetadata ()
После вызова getMetadata ()
Получены метаданные
Вероятно, это не то, что вы ожидали, но он работает так, как задумано, и точно объясняет, почему ваш код не работает: к моменту запуска if (localFile.lastModified() > onlineFileChangeDate[0])
onlineFileChangeDate[0] = storageMetadata.getUpdatedTimeMillis()
еще не установил для него значение.
Решение его (и любых других проблем с вызовами асинхронных методов) заключается в том, что код, которому нужны метаданные, должен находиться внутри onSuccess
, который вызывается с этими метаданными, или вызываться оттуда.
Самое простое исправление:
reference.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult listResult) {
for(final StorageReference item : listResult.getItems()) {
final File localFile = new File(rootpath, item.getName());
item.getMetadata().addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
@Override
public void onSuccess(StorageMetadata storageMetadata) {
if (localFile.lastModified() > storageMetadata.getUpdatedTimeMillis()) {
Log.i(TAG, "File deleted " + localFile.delete());
item.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(settings.this, "Downloaded: " + localFile, Toast.LENGTH_SHORT).show();
}
});
}
}
});
}
Toast.makeText(settings.this, "Update Complete", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG,"Firebase Update Error");
}
});
См. Также: