dart 什么时候关闭Flutter应用程序中的HTTP客户端?

s71maibg  于 2023-10-13  发布在  Flutter
关注(0)|答案(5)|浏览(108)

我的Flutter移动的应用程序与我的后端服务器通信。文档说使用Client类(IOClient)比普通的getput等更好。方法来维护对同一服务器的多个请求之间的持久连接。Docs还说:
当每个客户端被使用完后关闭它是很重要的;否则可能导致Dart进程挂起。
我不明白什么时候需要关闭客户端,因为几乎所有的应用程序屏幕都需要HTTP连接到同一个服务器。最好的做法是什么?

更新:

是否可以只在应用程序终止之前关闭Client,或者我应该在每次应用程序隐藏时关闭它(进入paused状态)?

iecba09b

iecba09b1#

我个人认为,在每个用户操作后关闭客户端是最好的做法。
我所说的“用户操作”可以由多个API请求组成。
所以我认为最好的是这样的:

var client = http.Client();
try {
  var response = await client.post(
      Uri.https('my-api-site.com', 'users/add'),
      body: {'firstname': 'Alain', 'Lastname': 'Deseine'});
  var Response = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
  ...
  // Add here every API request that you need to complete the users action
} finally {
  // Then finally destroy the client.
  client.close();
}
dxxyhpgq

dxxyhpgq2#

不要关闭HTTP客户端

对于你们中的一些人来说,这可能听起来很奇怪,但解决方案很简单,就像不做一样。
为什么
在大多数情况下,HTTP客户端应该在整个应用程序运行时都可用。此外,当用户关闭应用程序时,应用程序资源会自动丢弃。因此,在大多数情况下,我们不需要处理HTTP客户端的处置。

何时释放HTTP Client?

只有当我们想运行有限的,一次性的,预测的,季节性的HTTP请求。在这种情况下,您可以通过多种不同的方式来处置客户端(取决于您的状态管理或您想要触发处置的生命周期)。
dispose()函数对于所有处理缓存和本地资源的包都是通用的。文档中提到了这个选项,但并不建议您在每个场景中都使用它。它应该只在非常具体的情况下处理。
所以对于大多数人来说,不要丢弃HTTP客户端。

hgtggwj0

hgtggwj03#

每个服务器交互保持原子连接。

几乎所有的应用程序屏幕都需要HTTP连接到同一服务器
一件事是所有屏幕都进行http调用,另一件事是与服务器进行持续的高频交互。
假设我们有一个多人游戏应用程序,它需要每一秒都与服务器通信。如果是这样的话,让客户端打开将是至关重要的。即使你有架构的后果, dart 过程将挂起。这意味着dart可能不是高服务器流量应用程序的最佳解决方案。
据我所知你的应用程序不是这样的。你不需要担心保持连接打开不断,所以你可以只打开和关闭它每次你需要使用它,而不必支付高性能的价格。
如果你每次尝试使用你的API时都打开一个连接,那么对用户来说应该是“无障碍的”。
话虽如此,这里有一些关于这个主题的其他见解:

  • 连接到服务器的大量客户端,即使不活动,也可能消耗内存或对象的资源(例如,如果每个连接有一个线程)。另一方面,保持连接,将允许客户端更快地检测到服务器是否存在连接问题(如果这很重要的话)。Extracted from this other thread

希望这能帮助你,根据你的用例,做出更好的决定。

zqdjd7g9

zqdjd7g94#

在网络流量方面,最好在整个应用生命周期中使用相同的客户端。为每个API建立一个新的连接是非常昂贵的。然而,根据documentation

重要的是关闭每个客户端时,它的完成正在使用;否则可能会导致Dart进程挂起。

另外,如果没有调用client.close(),这并不意味着服务器将永远保持连接打开。如果连接空闲时间超过HTTP Keep-Alive Timeout,服务器将关闭连接。在这种情况下,如果客户端通过服务器关闭的连接发送一个新的请求,他将得到一个408 Request Timeout
因此,如果您决定在整个应用程序生命周期中使用相同的客户端,请记住您可能遇到的两个问题。

1mrurvl1

1mrurvl15#

关闭HttpClient HttpClient支持持久连接,并缓存网络连接,以便尽可能将它们重用于多个请求。这意味着网络连接可以在请求完成后保持打开一段时间。使用HttpClient.close强制HttpClient对象关闭并关闭空闲的网络连接。
我们必须阅读docs:
https://api.flutter.dev/flutter/dart-io/HttpClient-class.html

相关问题