首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在isolate中加载和解析Json?

如何在isolate中加载和解析Json?
EN

Stack Overflow用户
提问于 2020-06-27 03:19:41
回答 1查看 113关注 0票数 0

我正在尝试加载我的json,并在一个新的隔离中解析它。如果我理解正确的话,这可以让应用程序有更好的性能。

我为我的json充电,并在我未来的构建器之后解析它。我想在隔离之前解析它并返回它们,但是我不能显示我的json。

这是正确的方法还是毫无用处?

代码语言:javascript
复制
Future<Map<String, dynamic>> loadJson() async {
  /*
  * I load my Json without other isolate and I parse it in the future builder
  */
  final myJson = await rootBundle.loadString('assets/jsons/myJson.json');

  return {
    'myJson' : myJson
  };
}

Future<Map<String, dynamic>> loadJsonParsed() async {
  /*
  * I load my Json and parse it in other isolate
  */
  final myJson = await rootBundle.loadString('assets/jsons/myJson.json');
  var myJsonParsed = compute(_parseJson, myJson);

  return {
    'myJson' : myJsonParsed
  };
}
Map<String, dynamic>_parseJson(String responseBody) {
  final parsed = jsonDecode(responseBody);
  return parsed;
}

// Some code ...

@override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (() => FocusScope.of(context).requestFocus(FocusNode())),
      child: Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder(
          future: Future.wait([loadJson(), loadJsonParsed()]),
          builder: (context, snapshot) {
            if(snapshot.hasError) print(snapshot.error);
            if (!snapshot.hasData) {
              return LinearProgressIndicator();
            }

            print('BEGIN ================================');
            var myJson = json.decode(snapshot.data[0]['myJson']);
            print(myJson); // I see my json !
            print(myJson.runtimeType); // _InternalLinkedHashMap<String, dynamic>
            print('SEPARATION ================================');
            var myJsonParsed = snapshot.data[1]['myJson'];
            print(myJsonParsed); // Instance of 'Future<Map<String,dynamic>>' How to do ?
            print(myJsonParsed.runtimeType); // Future<Map<String,dynamic>>
            print('END ================================');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-27 03:30:13

如果json很小,可能不值得将解析转移到不同的隔离,因为此操作也有成本。Small / big是一种次要的东西,但根据常识,我们可能会应用正确的方法。

如果json很大,那么您所做的是正确的,否则dart将在主线程上执行解析,这可能会导致可见的jank。

关于compute不适合您的原因,此函数返回一个Future,而不是这样做

代码语言:javascript
复制
var myJsonParsed = compute(_parseJson, myJson);

您需要等待调用才能获得结果,否则将在此处存储未来的'myJson' : myJsonParsed,而不是json地图

代码语言:javascript
复制
var myJsonParsed = await compute(_parseJson, myJson); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62601505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档