likes
comments
collection
share

聊聊Flutter中的多线程

作者站长头像
站长
· 阅读数 41

聊多线程之前我们先看一个例子:下面是一个动画,点击动画下面的按钮,执行一段耗时任务,我这里以打印一段数字为例

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('开始打印'),
              )
            ],
          ),
        ),
      ),
    );
  }
}

聊聊Flutter中的多线程

点击‘开始打印’按钮,我们发现动画会卡一下,打印完成后动画正常旋转

聊聊Flutter中的多线程

我们再把打印的代码放到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
评论
请登录