Обеспечить обработку вызова REST в приложении флаттера в фоновом режиме - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно убедиться, что определенный HTTP-запрос был успешно отправлен.Поэтому мне интересно, существует ли простой способ перенести такой запрос в фоновую задачу службы.

История вопроса заключается в следующем: мы разрабатываем приложение для опросов с использованием флаттера.К сожалению, приложение предназначено для использования в среде, где мобильное интернет-соединение не может быть гарантировано.Поэтому я не могу просто опубликовать результат опроса один раз, но мне нужно повторить его, если он не удастся из-за проблем с сетью.Мой текущий код выглядит следующим образом.Проблема с моим текущим решением состоит в том, что оно работает, только когда приложение активно все время.Если пользователь свернет или закроет приложение, данные, которые я хочу загрузить, будут потеряны.Поэтому я ищу решение, чтобы обернуть процесс загрузки в фоновую задачу службы, чтобы он обрабатывался, даже когда пользователь закрывает приложение.Я нашел несколько постов и плагинов (а именно https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124 и https://pub.dartlang.org/packages/background_fetch), но они не помогают в моем конкретном случае использования. Первый описывает способ, которым приложение может быть уведомлено при наступлении определенного события (а именновозникла геозона), а вторая работает только каждые 15 минут и фокусируется на другом сценарии. Кто-нибудь знает простой способ, как я могу гарантировать, что запрос был обработан, даже если есть плохое подключение к Интернету (или даже нет на данный момент) позволяя пользователям свернуть или даже закрыть приложение?

Future _processUploadQueue() async {
  int retryCounter = 0;
  Future.doWhile(() {
    if(retryCounter == 10){
      print('Abborted after 10 tries');
      return false;
    }
    if (_request.uploaded) {
      print('Upload ready');
      return false;
    }
    if(! _request.uploaded) {
      _networkService.sendRequest(request: _request.entry)
          .then((id){
            print(id);
            setState(() {
              _request.uploaded = true;
            });
      }).catchError((e) {
        retryCounter++;
        print(e);
      });
    }
    // e ^ retryCounter, min 0 Sec, max 10 minutes
    int waitTime = min(max(0, exp(retryCounter)).round(), 600);
    print('Waiting $waitTime seconds till next try');
    return new Future.delayed(new Duration(seconds: waitTime), () {
      print('waited $waitTime seconds');
      return true;
    });
  })
  .then(print)
  .catchError(print);
}

1 Ответ

1 голос
/ 27 марта 2019

Вы можете использовать плагин shared_preferences для сохранения каждого HTTP-ответа на устройство, пока загрузка не завершится успешно. Как это:

requests: [
  {
    id: 8eh1gc,
    request: "..."
  },
  ...
],

Затем при каждом запуске приложения проверьте, есть ли какие-либо запросы в списке, повторите их и удалите, если они завершены. Вы также можете использовать background_fetch, чтобы делать это каждые 15 минут.

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