Flutter 避免阻塞ui线程
import 'dart:async';
import 'dart:isolate';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
String _data = '';
bool loading = true;
@override
void initState() {
super.initState();
_init();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: loading ? CircularProgressIndicator() : Text(_data),
),
);
}
Future<void> _init() async {
final worker = Worker();
await worker.isReady;
var data = await worker.getData();
setState(() {
_data = data;
loading = false;
});
worker.dispose();
}
}
class Worker {
Isolate _isolate;
/// 发送端口
SendPort _sendPort;
/// 接收端口
ReceivePort _receivePort;
final _isReady = Completer<void>();
Future<void> get isReady => _isReady.future;
final _data = Completer<String>();
Future<String> get data => _data.future;
Worker() {
_init();
}
Future<void> _init() async {
_receivePort = ReceivePort()..listen(_handleMessage);
_isolate = await Isolate.spawn(
_isolateEntry,
_receivePort.sendPort,
);
}
Future<String> getData() {
_sendPort.send(null);
return data;
}
void _handleMessage(dynamic message) {
if (message is SendPort) {
_sendPort = message;
_isReady.complete();
return;
}
_data.complete(message);
}
static void _isolateEntry(dynamic message) {
SendPort sendPort;
final receivePort = ReceivePort()
..listen((dynamic message) async {
await Future.delayed(Duration(seconds: 1));
var r = await http.get('http://192.168.0.104:3000');
sendPort.send(r.body);
});
if (message is SendPort) {
sendPort = message;
sendPort.send(receivePort.sendPort);
}
}
dispose() {
_isolate.kill();
}
}
Flutter 避免阻塞ui线程的更多相关文章
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- 千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死
原文地址:https://www.cnblogs.com/wangchuang/archive/2013/02/20/2918858.html .c# Invoke和BeginInvoke 区别 Co ...
- Qt中运行后台线程不阻塞UI线程的方案
有一个想法,一个客户端,有GUI界面的同时也要向网络服务器发送本地采集的数据,通过网络发送数据的接口是同步阻塞的,需要等待服务器响应数据. 如果不采用后台线程的方案,用主UI线程关联一个定时器QTim ...
- android的AsyncTask.get()方法会阻塞UI线程
AsyncTask.get()方法, 是有阻塞UI的能力的.
- jquery中的ajax请求,阻塞ui线程的解决方案(自己总结的demo)
/*****************************************************/ function getAjaxData(url,data){ showLoading( ...
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则 ...
- Android Studio学习随笔-UI线程阻塞以及优化
我们在使用手机的时候,经常会遇到一个问题:先是卡死,然后跳出该程序无响应,是否关闭的提示(当然有可能是我们手机性能太差=.=)这是因为线程的阻塞引起的,在这里我讲述一下UI线程,一般处理程序会在UI线 ...
- 第10讲- UI线程阻塞及其优化
第10讲UI线程阻塞及其优化 .UI 阻塞demo (首先在activity_main.xml中放置两个button,分别命名为button1,button2) //首先设置一个button1用来进行 ...
- jQuery同步Ajax带来的UI线程阻塞问题
一.需求 在调ajax接口的时候因为有时间延迟,想要做一个loading加载的效果,等数据返回时再把loading的效果去掉. 所以我在调ajax的代码块前面加了显示loading效果的代码,ajax ...
随机推荐
- java中的IO处理和使用,API详细介绍(一)
写在前面:本文章基本覆盖了java IO的全部内容,java新IO没有涉及,因为我想和这个分开,以突出那个的重要性,新IO哪一篇文章还没有开始写,估计很快就能和大家见面.照旧,文章依旧以例子为主,因为 ...
- ceph --- (简单操作及openstack交接)
部署ceph :https://www.cnblogs.com/cloudhere/p/10519647.html Centos7部署ceph:https://www.cnblogs.com/kevi ...
- liux 常用操作命令
tail -f /home/jyapp/apache-tomcat-7.0.59/logs/catalina.out //查看实施日志 //删除临时目录并且启动服务器 rm -rf /home/jy ...
- 遇到的一个bug
/// <summary> /// 检测玩家是否在机器人的球形碰撞体内,这个碰撞体是机器人的侦测范围,玩家在内部会进行视野检测和声音检测 /// </summary> priv ...
- 嵌入式的我们为什么要学ROS
- 2019CCPC厦门站总结
这是一篇打铁游记~ $day1$ 坐动车去厦门,三个人买了一堆零食,吃了一路,除了睡觉嘴巴基本就没停过.当然,我们到酒店后也去吃了烧烤,我们虽然是在岛外的厦门北站的下的,还是很幸运的找到一家好吃了,乌 ...
- AtCoder Beginner Contest 174
第一次 ak ABC,纪念一下. 比赛链接:https://atcoder.jp/contests/abc174 A - Air Conditioner #include <bits/stdc+ ...
- P3803 [模板] 多项式乘法 (FFT)
Rt 注意len要为2的幂 #include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); inli ...
- Nginx基础 - 配置代理web服务
1.反向代理及负载均衡Nginx实现负载均衡用到了proxy_pass代理模块核心配置,将客户端请求代理转发至一组upstream虚拟服务池. 1)upstream配置语法 Syntax: upstr ...
- Windows10电脑优化和使用
本文将结合自身经验和短视频软件中的优化技巧,推荐一些Win10系统的优化和使用小技巧. 电脑优化 新电脑调出我的电脑等桌面图标: 右键桌面,选择个性化,左侧选择主题,在相关的设置中找到桌面图标设置,将 ...