簡體   English   中英

確保在后台處理Flutter應用中的REST調用

[英]Ensure processing of a REST call in flutter app in background

我需要確保某個HTTP請求已成功發送。 因此,我想知道是否存在一種簡單的方法將此類請求移至后台服務任務。

我的問題的背景如下:我們正在使用flutter開發一個調查應用程序。 不幸的是,該應用程序只能在無法保證移動互聯網連接的環境中使用。 因此,我不能簡單地一次發布調查結果,但是如果由於網絡問題而失敗,我必須重試。 我當前的代碼如下所示。 我當前解決方案的問題在於,它僅在應用程序始終處於活動狀態時才起作用。 如果用戶最小化或關閉該應用程序,我要上傳的數據將丟失。 因此,我正在尋找一種將上傳過程包裝在后台服務任務中的解決方案,以便即使用戶關閉該應用程序也可以對其進行處理。 我找到了幾個帖子和插件(即https://medium.com/flutter-io/executing-dart-in-the-background-with-flutter-plugins-and-geofencing-2b3e40a1a124https://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);
}

您可以使用插件shared_preferences將每個HTTP響應保存到設備,直到上傳成功完成。 像這樣:

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

然后,每當啟動該應用程序時,請檢查列表中是否有任何請求,然后重試這些請求,如果完成則將其刪除。 您也可以每15分鍾使用background_fetch進行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM