Я пишу Java-приложение для Android, используя Google Firestore.Когда пользователь создает данные, они должны храниться в Firestore (пользователь нажимает кнопку «отправить»).Приложение отображает ProgressBar, пока хранилище не будет успешным или не сможет работатьКак обнаружить данные хранятся (локально или на удаленном сервере)?Я хотел бы сообщить пользователю, является ли хранилище успешным (данные хранятся на сервере), локально успешным (сервер недоступен, но автономное хранилище в порядке) или неудачным.
Для завершения хранения на сервере,это легко обнаружить по регистрации OnCompleteListener в Задаче.
Но когда сервер недоступен, слушатель не вызывается (на самом деле, он вызывается позже, когда сервер снова доступен, нопользователь не может ждать так долго!).Я обнаружил, что можно получать уведомления, что данные хранятся локально с помощью EventListener, зарегистрированного в DocumentReference.Этот слушатель может получить информацию с помощью documentSnapshot.getMetadata (). IsFromCache () и documentSnapshot.getMetadata (). HasPendingWrites ().Но этот слушатель уведомляется также, когда сервер находится в сети и данные хранятся на сервере.
progressBar.setVisibility(View.VISIBLE);
final DocumentReference documentReference =
FirebaseFirestore.getInstance().document(documentFirestorePath);
documentReference. addSnapshotListener(this, MetadataChanges.INCLUDE,
new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable final DocumentSnapshot documentSnapshot, @Nullable final FirebaseFirestoreException e) {
Log.i("MyActivity", "isFromCache: "+documentSnapshot.getMetadata().isFromCache()+", write pending:
"+documentSnapshot.getMetadata().hasPendingWrites());
} });
documentReference.set(newContact).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull final Task<Void> task) {
Log.i("MyActivity", "completed");
progressBar.setVisibility(View.INVISIBLE);
if (task.isSuccessful()) {
finish();
} else {
// Inform the customer the action failed
}
}
});
Вот журналы, когда сервер находится в сети:
2019-06-13 08:11:14.126 I/MyActivity: isFromCache: true, write pending: false
2019-06-13 08:11:14.170 I/MyActivity: isFromCache: true, write pending: true
2019-06-13 08:11:14.218 I/MyActivity: isFromCache: false, write pending: true
2019-06-13 08:11:14.470 I/MyActivity: completed
2019-06-13 08:11:14.552 I/MyActivity: isFromCache: false, write pending: false
И журналыкогда сервер находится в автономном режиме:
2019-06-13 08:12:08.185 I/MyActivity: isFromCache: true, write pending: false
2019-06-13 08:12:08.215 I/MyActivity: isFromCache: true, write pending: true
And when the server is back, the following logs are added:
2019-06-13 08:12:40.460 I/MyActivity: isFromCache: false, write pending: true
2019-06-13 08:12:40.671 I/MyActivity: completed
2019-06-13 08:12:40.753 I/MyActivity: isFromCache: false, write pending: false