结合项目情况,数据量不大,发现不了问题,问题不够明显,如果真的进入生产上线阶段,会暴露很多问题,比如数据,大数据量时首屏/刷新会卡顿,点击进入详情响应会很慢,现在对数据解析上进行优化。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

数据与解析优化

现在涉及优化的实现:大 JSON/JS 解析放入 isolate、首页图片 URL → 作品 O(1) 查找、移除人为 400ms 加载延迟。


在这里插入图片描述

一、目标与方案

  • 目标
    1. 大 JS/JSON 解析不阻塞 UI 线程,首屏/刷新时界面不卡顿。
    2. 首页点击图片进入详情时,由线性遍历改为 O(1) 查找,响应更快。
    3. 去掉人为 400ms 延迟,体感加载更快。
  • 方案
    • 3.1:将「原始字符串 → 提取 JSON 数组 → 解码」放入 compute(parseWorksRawInIsolate, jsContent),在 isolate 中返回 List<Map<String, dynamic>>;主 isolate 仅做 parseWorksextractAllImages 等轻量反序列化。
    • 3.2:在 _works / _images 变化时维护 Map<String, ({WorkModel work, int index})> _imageToWorkMap,点击时 O(1) 查找。
    • 3.3:删除 _loadMore 中的 await Future.delayed(const Duration(milliseconds: 400)),正式与调试环境均不再人为延迟。

二、涉及文件

文件 说明
lib/utils/data_parser.dart 新增顶层函数 parseWorksRawInIsolate(String)compute 调用;parseWorksAndImages 改为先 compute(parseWorksRawInIsolate, jsContent) 再在主线程 parseWorksextractAllImages
lib/pages/home_page.dart 新增 _imageToWorkMap_rebuildImageToWorkMap(),在设置 _works 后调用;_findWorkForImage 改为查 Map;移除 _loadMore 中 400ms 延迟。
lib/pages/search_page.dart 无改动,仍调用 DataParser.parseWorksAndImages,自动享受 isolate 解析。

无新增 pub 依赖;仅使用 Flutter 内置 foundation.dartcompute


三、实现说明

3.1 大 JSON/JS 解析放入 isolate(3.1)

  • 顶层函数parseWorksRawInIsolate(String jsContent)data_parser.dart 中定义为顶层函数(compute 要求顶层或静态),内部调用 DataParser.extractJsonArrayFromJs(jsContent),将得到的 List<dynamic> 转为 List<Map<String, dynamic>> 并返回。重计算(正则、json.decode)均在 isolate 内完成。
  • 主线程parseWorksAndImages 内执行 rawList = await compute(parseWorksRawInIsolate, jsContent),再在主 isolate 执行 parseWorks(rawList)extractAllImages(works),返回 {'works': works, 'images': allImages}。对外接口不变,首页与发现页无需改调用方式。
  • 序列化:isolate 只传递 String 入参和 List<Map<String, dynamic>> 返回值,无需 WorkModel/AuthorModel 跨 isolate 序列化。

3.2 首页图片 URL → 作品 O(1) 查找(3.2)

  • 结构Map<String, ({WorkModel work, int index})> _imageToWorkMap,key 为图片 URL,value 为所属作品及在该作品 images 中的下标。
  • 维护_rebuildImageToWorkMap() 清空 Map 后遍历 _works,对每个作品的 images 写入 _imageToWorkMap[url] = (work: w, index: i)。在 _loadData 中设置完 _works/_images 后、在 _initWithCacheThenLoad 中 setState 设置 _works 后均调用一次。
  • 查找_findWorkForImage(imageUrl) 改为 _imageToWorkMap[imageUrl] ?? (work: null, index: 0),点击进入详情时 O(1)。

3.3 移除延迟

  • 修改:在 _loadMore 中删除 await Future.delayed(const Duration(milliseconds: 400)),直接进行分页切片与 setState,网络快时首屏与滚动加载更快。

四、关键代码

4.1 isolate 解析(data_parser.dart)

import 'package:flutter/foundation.dart';

/// 供 compute 在 isolate 中调用:仅做 JS 提取与 JSON 解码
List<Map<String, dynamic>> parseWorksRawInIsolate(String jsContent) {
  final list = DataParser.extractJsonArrayFromJs(jsContent);
  return list
      .map((e) => Map<String, dynamic>.from(e as Map<dynamic, dynamic>))
      .toList();
}

// parseWorksAndImages 内:
static Future<Map<String, dynamic>> parseWorksAndImages(String jsContent) async {
  final rawList = await compute(parseWorksRawInIsolate, jsContent);
  final works = parseWorks(rawList);
  final allImages = extractAllImages(works);
  return { 'works': works, 'images': allImages };
}

4.2 图片 URL → 作品 Map(home_page.dart)

final Map<String, ({WorkModel work, int index})> _imageToWorkMap = {};

void _rebuildImageToWorkMap() {
  _imageToWorkMap.clear();
  for (final w in _works) {
    for (var i = 0; i < w.images.length; i++) {
      _imageToWorkMap[w.images[i]] = (work: w, index: i);
    }
  }
}

({WorkModel? work, int index}) _findWorkForImage(String imageUrl) {
  final entry = _imageToWorkMap[imageUrl];
  if (entry != null) return (work: entry.work, index: entry.index);
  return (work: null, index: 0);
}
// 在 _loadData 与 _initWithCacheThenLoad 中设置 _works 后调用 _rebuildImageToWorkMap()

4.3 移除 400ms 延迟(home_page.dart)

  • _loadMore 中删除:await Future.delayed(const Duration(milliseconds: 400));,直接执行后续分页逻辑。

五、注意事项

  • compute 要求parseWorksRawInIsolate 必须为顶层或静态函数,且入参、返回值需可跨 isolate 传递(String、List、Map 等基本/可序列化类型)。WorkModel 不跨 isolate,仅在主线程由 List<Map<String, dynamic>> 反序列化。
  • Map 更新时机:只要 _works 被重新赋值(拉取新数据或从缓存恢复),就需调用 _rebuildImageToWorkMap(),保证点击时 Map 与当前列表一致。
  • 发现页:继续使用 DataParser.parseWorksAndImages,无需改代码即可享受 isolate 解析,接口保持不变。

六、小结

通过将 JS/JSON 重解析放入 compute(parseWorksRawInIsolate, jsContent)、首页维护 _imageToWorkMap 并在点击时 O(1) 查找、以及移除 400ms 人为延迟,完成了「三、数据与解析」中优先级优化:大数据量时首屏/刷新不卡顿,点击进入详情响应更快,加载体感更顺畅。

结束语

感谢阅读本帖,如对贴中内容有意见和建议的,欢迎与我联系交流,也欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐