Hirabbit_jaden 2019-03-20 19:44 采纳率: 50%
浏览 2376
已采纳

flutter中使用socket导致UI卡顿?

  1. 在flutter使用tcp请求服务器的时候,在listen中对tcp流进行解析,解析过程包含拆包和拼包,正常情况下都没有问题,但是当服务器推送的流过快的时候,导致UI卡死,有人有好的建议吗?
  2. 代码如下: Future<Socket> _connect(String ip, int port) async{ if(!isConnect()) { try { _socket = await Socket.connect(ip, port, timeout: Duration(seconds: 20),); _socket.listen(_onData, onError: _onError, onDone: _onDone); }catch(e){ if(e is SocketException){ _onTimeout(); }else{ print("error : $e"); } } } return _socket; } _onData中是一些拼包拆包的业务逻辑,当tcp流包含多个业务报文的时候,onData中会循环拆分包直至拆分完成,每个包都会回调到具体的业务逻辑。。现在问题是,如果服务器发送的是base64图片的话,系统就会卡死,请问 下这个问题怎么解决?
  • 写回答

3条回答 默认 最新

  • Hirabbit_jaden 2019-04-04 08:46
    关注

    问题解决了,我发现在release模式下才会卡顿,在debug模式下不会卡顿。
    因为服务器那边会通过tcp一直推送图片,然后每个tcp报文在release模式下大概为1800000个长度的List,而debug模式下每个报文为500000的List长度,图片大概是150000的长度,因此,每次要对报文进行拆包操作
    ,用到List.sbulist和addall这两个api,如果报文太大的话,这两个会耗时较长,导致下一个包没有及时收取,会导致卡顿。。
    我的解法是,对每个数据list进行拆分处理,拆分成static const int SOCKET_LENGTH = 1024 * 256这么长的小段,然后对小段进行拆包拼包处理。
    总结就是sublist 和 addall在list长度较长的时候效率极低,我的优化是不直接处理原始包,先把原始包拆分为中包,然后在依次拼接这些中包来读取图片数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵