【问题标题】:Flutter Parallel Network callFlutter 并行网络调用
【发布时间】:2021-07-03 12:21:47
【问题描述】:

我是 Flutter 的新手。我需要在一个屏幕中调用 5 个 API 网络调用。我使用 Async/await 需要很长时间。我们如何使用隔离或其他类似方法在单独的线程上并行执行它?

【问题讨论】:

  • 您可以使用 .then 而不是 await so 并在完成时获取价值来替换您需要的内容,而不会阻塞每个 api

标签: flutter dart-isolates


【解决方案1】:

您可以为此目的使用isolate,isolate 是dart 中的一种多线程。 Isolate 创建一个新线程并在新线程上执行操作,以便分配负载。您不能将变量作为数据来回发送,而是使用端口发送消息。

这是一个简单的示例,使用 API 调用进行隔离并使用端口将数据发送回主线程。

首先让我们创建一个函数,它将作为隔离的入口点:

static entryPoint(SendPort sendPort)async{
    var response = await http.get('https://www.thecocktaildb.com/api/json/v1/1/search.php?s=margarita');
    sendPort.send(response.body); //sending data back to main thread's function
}

现在让我们创建隔离:

static void callApi()async{
    var recievePort = new ReceivePort(); //creating new port to listen data
    await Isolate.spawn(entryPoint, recievePort.sendPort);//spawing/creating new thread as isolates.
    recievePort.listen((message) {  //listening data from isolate
      print(message);
    });
}

【讨论】:

  • 如何将结果返回给主隔离?请提供任何代码示例。
  • 您无法返回或共享数据。您可以做的一件事是使用发送端口发送消息并在端口中接收消息,就像我在答案中所做的那样。如果您想进一步了解,请打开一个新问题并在此处提供链接。
【解决方案2】:

您可以使用dio 包并调用多个并发API请求,请查看文档:

Package: https://pub.dev/packages/dio

【讨论】:

  • 我试过 Dio 包,但它似乎像普通的 http 包一样工作。你能帮忙提供一些并发 API 请求的示例代码吗
【解决方案3】:

你可以使用 Future.wait()

Here is the answer with an example

【讨论】:

  • 我试过 Future.wait()。但似乎它在同一个线程上执行所有调用。所以它也需要很长时间,虽然它是并行执行的。
  • 我认为问题在于接收每个呼叫的响应所需的时间。如果您在收到响应后要执行 cpu 绑定计算,那么隔离就是要走的路。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多