确保在后台处理 Flutter 应用程序中的 REST 调用
Posted
技术标签:
【中文标题】确保在后台处理 Flutter 应用程序中的 REST 调用【英文标题】:Ensure processing of a REST call in flutter app in background 【发布时间】:2019-03-27 14:44:57 【问题描述】:我需要确保某个 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】:您可以使用插件shared_preferences
将每个HTTP 响应保存到设备,直到上传成功完成。像这样:
requests: [
id: 8eh1gc,
request: "..."
,
...
],
然后,每当启动应用程序时,检查列表中是否有任何请求,重试它们,如果完成则将其删除。您也可以使用background_fetch
每 15 分钟执行一次。
【讨论】:
我已经像你一样成功了,但我仍然认为这有点丑陋,如果有一个优雅的解决方案会很酷。不过还是谢谢。以上是关于确保在后台处理 Flutter 应用程序中的 REST 调用的主要内容,如果未能解决你的问题,请参考以下文章
带有 WebView 的 Flutter 应用中的 Firebase 身份验证
如何在后台使用 Flutter Method Channel(应用最小化/关闭)