聊聊Flutter中的多线程
聊多线程之前我们先看一个例子:下面是一个动画,点击动画下面的按钮,执行一段耗时任务,我这里以打印一段数字为例
import 'package:flutter/material.dart';
class Page2 extends StatefulWidget {
@override
_Page2State createState() => _Page2State();
}
class _Page2State extends State<Page2> with SingleTickerProviderStateMixin {
Animation<double> _animation;
AnimationController _controller;
_myPrint(int num) {
for (int i = 0; i < num; i++) {
print('$i');
}
}
_startMyEvent() {
_myPrint(10000);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
void initState() {
super.initState();
_controller = AnimationController(duration: Duration(seconds: 2), vsync: this);
_animation = Tween<double>(begin: 0, end: 1).animate(_controller)..addStatusListener((status) {
if (status == AnimationStatus.completed) {
_controller.repeat();
}
});
_controller.forward();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('title'),
),
body: Container(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
RotationTransition(
turns: _animation,
child: Container(width: 100, height: 100, color: Colors.red),
),
SizedBox(height: 30,),
FlatButton(
onPressed: (){
_startMyEvent();
},
child: Text('开始打印'),
)
],
),
),
),
);
}
}
点击‘开始打印’按钮,我们发现动画会卡一下,打印完成后动画正常旋转
我们再把打印的代码放到Future异步执行一下
_myPrint(int num) {
for (int i = 0; i < num; i++) {
print('$i');
}
}
_startMyEvent() {
Future((){
_myPrint(10000);
});
}
发现还是会卡顿一下,我们都知道dart是单线程模型,但是并不代表Flutter所有工作都是在同一个线程中完成,我们最熟悉的网络请求其实是Flutter调用的系统层面的多线程服务,在我们这里就要用到Flutter中的isolate了,compute是对isolate的封装,我们直接使用compute就行,用法如下:
_myPrint(int num) {
for (int i = 0; i < num; i++) {
print('$i');
}
}
_startMyEvent() {
compute(_myPrint, 10000);
}
compute中第一个参数是方法名,第二个参数是要传的参数,这时候我们再点击一下按钮,发现动画不会卡顿了,在实际工作中,如果我们有比较耗时的操作,可以使用compute新开一个线程执行耗时操作。
咸鱼技术团队有对多线程的详细介绍
转载自:https://juejin.cn/post/6939075156014792734