Выполнять отложенные записи, когда приложение закрыто - PullRequest
2 голосов
/ 26 апреля 2019

Firestore не выполняет отложенные записи, когда приложение закрыто (убито системой или удалено пользователем).Каждая запись, которая ставится в очередь, когда приложение офлайн , будет выполняться только тогда, когда приложение подключено к сети и снова запущено.

Я хотел бы выполнить эти записи вручную в фоновом режиме, поэтому я использую Work Mananger, который включает в себя следующую строку кода:

FirebaseFirestore.getInstance().enableNetwork();

Полный фрагмент:

public class FirebaseSyncWorker extends Worker {

    public FirebaseSyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        FirebaseFirestore.getInstance().enableNetwork();

        return Result.success();
    }
}

Этот код работает для меня. Он синхронизирует данные пользователя время от времени, когда приложение закрывается.Тем не менее, я не уверен, что это правильный способ сделать это.

Насколько я знаю, enableNetwork() предназначен для повторного включения доступа к сети после его отключения.Мое приложение никогда не отключает его, я просто использую его для выполнения ожидающих записей.

Это хороший способ достичь того, чего я хочу?Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 03 мая 2019

enableNetwork() довольно умный способ сделать это. Он не был предназначен для этого использования, но он работает.

Причина в том, что enableNetwork() предназначен для идемпотентности. Вы можете звонить так часто, как хотите, и если сеть уже включена, она ничего не делает. (disableNetwork() ведет себя так же.)

Другая часть того, почему это работает, заключается в том, что Firestore не запускает свою внутреннюю рабочую очередь, пока вы что-то не сделаете с ним. Мы делаем это по ряду причин, но главным образом это позволяет вам позвонить setFirestoreSettings(), прежде чем мы что-либо сделаем.

Ваше решение работает, потому что enableNetwork() - это вызов, который запускает этот внутренний запуск, но в конечном итоге ничего не делает, потому что сеть уже включена.

Обратите внимание, что Firestore на самом деле не создает сетевое соединение, если у него нет ничего общего, поэтому запускать его по-своему относительно дешево, и если ничего не делать, он проверит наличие ожидающих записей и ничего не делать.

Вы могли бы улучшить это, если бы существовал API, позволяющий узнать, закончили ли мы синхронизацию ожидающих записей. Мы развили эту идею, но не определились с API, который нам нужен, и не смогли расставить приоритеты по сравнению с другими работами. Если это было очень важно для вас, обратите внимание, что источник открыт на https://github.com/firebase/firebase-android-sdk/, и мы очень дружелюбны: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...