我想從一個字串生成一個包含 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 個專案的串列?
uj5u.com熱心網友回復:
您的主要問題可能是您在處理要從 JSON 字串中提取的每個欄位fetchCoinList運行的地方進行JSON 決議的一種可怕的方式。jsonDecode()
您應該改為快取來自jsonDecode(). 此外,您還應該快取您正在執行的其他一些操作。
我做了以下示例來說明如何重寫代碼:
List<CoinData> fetchCoinList(ListConfig listConfig) {
final jsonObject = jsonDecode(listConfig.listData) as Map<String, dynamic>;
List<CoinData> coinList = [];
for (int index = listConfig.listStart; index < listConfig.listEnd; index ) {
final dataMap = jsonObject['data'][index] as Map<String, dynamic>;
if (dataMap['rank'] == null ||
dataMap['priceUsd'] == null ||
dataMap['changePercent24Hr'] == null) continue;
print(listConfig.listEnd);
final symbol = dataMap['symbol'] as String;
coinList.add(CoinData(
rank: dataMap['rank'] as int,
name: dataMap['name'] as String,
symbol: symbol,
id: dataMap['id'] as String,
value: double.parse(jsonObject['priceUsd'] as String),
percentChange: double.parse(jsonObject['changePercent24Hr'] as String),
image:
'https://static.coincap.io/assets/icons/${symbol.toLowerCase()}@2x.png'));
}
return coinList;
}
class CoinData {
final int rank;
final String name;
final String symbol;
final String id;
final double value;
final double percentChange;
final String image;
CoinData({
required this.rank,
required this.name,
required this.symbol,
required this.id,
required this.value,
required this.percentChange,
required this.image,
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417321.html
標籤:
