【发布时间】:2022-01-17 10:32:45
【问题描述】:
我想从一个字符串生成一个包含 300 个项目的列表,但是当这个任务被分成 3 个隔离时,每个隔离生成一个包含 100 个项目的列表,它需要的时间与单个隔离生成一个300 项的列表。
下面的 fetchCoinList() 方法是在隔离中运行的,generateList() 方法产生 3 个隔离。
所有这些隔离确实并行工作并返回各自的列表。
List<CoinData> fetchCoinList(ListConfig listConfig) {
List<CoinData> coinList = [];
for (int index = listConfig.listStart; index < listConfig.listEnd; index++) {
if (jsonDecode(listConfig.listData)['data'][index]['rank'] == null ||
jsonDecode(listConfig.listData)['data'][index]['priceUsd'] == null ||
jsonDecode(listConfig.listData)['data'][index]['changePercent24Hr'] ==
null) continue;
int rank =
int.parse(jsonDecode(listConfig.listData)['data'][index]['rank']);
String name = jsonDecode(listConfig.listData)['data'][index]['name'];
String symbol = jsonDecode(listConfig.listData)['data'][index]['symbol'];
String id = jsonDecode(listConfig.listData)['data'][index]['id'];
double value = double.parse(
jsonDecode(listConfig.listData)['data'][index]['priceUsd']);
double percentChange = double.parse(
jsonDecode(listConfig.listData)['data'][index]['changePercent24Hr']);
String image =
'https://static.coincap.io/assets/icons/${symbol.toLowerCase()}@2x.png';
print(listConfig.listEnd);
coinList.add(CoinData(rank, id, name, symbol, value, percentChange, image));
}
return coinList;
}
Future<List<CoinData>> generateList(String response) async {
print("Inside isolate");
List<CoinData> coinList = [];
List list = [];
for (int i = 0; i < 3; i++) {
ListConfig listConfig = ListConfig(response, i * 100, (i * 100) + 100);
list.add(compute(fetchCoinList, listConfig));
}
for (int i = 0; i < 3; i++) {
coinList = coinList + await list[i];
}
return coinList;
}
有什么办法可以解决这个问题?如果需要(不挂主线程),如何生成 300 或 1000 个项目的列表?
【问题讨论】:
-
请不要针对同一主题创建多个问题。你已经发布了:stackoverflow.com/questions/70730674/…
-
“如果需要(不挂主线程),如何生成一个包含 300 或 1000 个项目的列表?” - 所以现在你打电话给
compute运行三遍,主线程挂了? -
话虽如此。在您的示例中不清楚您如何从主隔离中调用这些方法。
-
@pskink 在这种情况下,主线程不会挂起,但是隔离生成它们各自的列表需要很长时间......如果我要在主线程上生成一个包含 300 个项目的列表会在更短的时间内生成它,但它会导致用户界面在这段时间内冻结。
-
还应该注意
fetchCoinList根本没有以任何有效的方式编写。每次需要数据结构中的元素而不是保存jsonDecode的结果时,您都调用jsonDecode,这实际上有点可怕。
标签: multithreading flutter dart dart-isolates