Получение локального кеша с огромной задержкойAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Получение локального кеша с огромной задержкой

Сообщение Anonymous »

Я пытаюсь заставить Firebase использовать данные из кеша, если при работе с моим приложением для Android пропадает соединение с Интернетом в React Native.
Идея в том, что когда пользователь открывает экран, он видит список групп. Группы хранятся в облаке Firebase.
Если есть подключение к Интернету, то проблем нет. Однако если я отключу интернет на эмуляторе, то работа с кешем становится совсем странной.
Что я делаю и что вижу::
  • Я отключаю интернет
  • Перехожу на другой экран приложения.
  • Я возвращаюсь на экран с группами. Я ожидаю, что группы будут мгновенно загружены из кеша. Вместо этого я жду 10 секунд, прежде чем группы появятся.
  • Я повторяю шаги 2–3, но на этот раз ожидание занимает около минуты. .
  • Я повторяю шаги 2-3 еще раз, но на этот раз ожидание занимает около 8 минут.
  • После очередного повторения я ждал около 5 минут.
Все это время я не включал интернет на эмуляторе. Итак, список групп вернулся из кэша. Но почему это занимает так много времени?
Обратите внимание, что я специально задал использование кеша в .get({source: 'cache'}).
Код компонента:

Код: Выделить всё

  const fetchGroups = async () => {
const grps = await firebaseConnector.getGroups();
try {
Alert.alert(`${grps.length}`);
} catch (error) {
Alert.alert('error');
}
setGroups([...grps]);
};

useFocusEffect(
useCallback(() => {
fetchGroups();
}, []),
);
Метод FirebaseConnector:

Код: Выделить всё

  async getGroups(): Promise {
try {
var groupsItems: GroupItem[] = [];
const grpsPartSnapshot = await firestore()
.collection('GroupParticipants')
.where('UserId', '==', this.userId)
.get({source: 'cache'});

const grpsIds = grpsPartSnapshot.docs.map(x => x.data().GroupId);
for (const grpIndex in grpsIds) {
var grpId = grpsIds[grpIndex];
var grpInfo = await firestore()
.collection('Groups')
.doc(grpId)
.get({source: 'cache'});

groupsItems.push({
id: grpInfo.id,
name: grpInfo.data()?.Name,
imageSource: grpInfo.data()?.Image,
});
}
return groupsItems;
} catch (error) {
console.error(error);
return [];
}
}
UPD
Заметил, что поведение меняется в зависимости от того, КАКОЙ экран я перехожу. Если я перехожу на пустой экран, группы появляются как положено, мгновенно из кеша.
Если я перехожу на скриншот, где отображается другая информация из Firestore (почему-то всегда без проблемы), то я наблюдаю поведение выше.

Подробнее здесь: https://stackoverflow.com/questions/787 ... huge-delay
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»