[英]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-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);
}
您可以使用插件shared_preferences
將每個HTTP響應保存到設備,直到上傳成功完成。 像這樣:
requests: [
{
id: 8eh1gc,
request: "..."
},
...
],
然后,每當啟動該應用程序時,請檢查列表中是否有任何請求,然后重試這些請求,如果完成則將其刪除。 您也可以每15分鍾使用background_fetch
進行一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.