美文网首页
3.flutter 线程和异步

3.flutter 线程和异步

作者: aofeilin | 来源:发表于2022-08-01 16:09 被阅读0次
截屏2022-08-02 09.00.05.png

1.flutter是一个单线程,eventloop事件循环。支持Isolate

async await 异步请求非阻塞式的调用 Future


截屏2022-08-01 12.24.33.png
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class ZFLAsyncThreadPage extends StatefulWidget {
  @override
  _ZFLAsyncThreadPageState createState() => _ZFLAsyncThreadPageState();
}

class _ZFLAsyncThreadPageState extends State<ZFLAsyncThreadPage> {
  List<dynamic> datas = [];
  @override
  void initState() {
    super.initState();
    loadData();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: ListView.builder(
        itemCount: datas.length,
          itemBuilder: (BuildContext context, int index){
        return Text('${datas[index]}');
      }),
    );
  }

  loadData() async{
    String url = 'https://jsonplaceholder.typicode.com/posts';
    http.Response response =  await http.get(url);
    datas = json.decode(response.body);
    setState(() {
    });
  }
}

2.Future和非Future。

//非Future
  String getNetworkData() {
    print('请求中');
    sleep(Duration(seconds: 2));
    return "执行完成";
//  var result = getNetworkData();
//  print(result);
//  print("main end");
    //I/flutter ( 7143): 请求中
    //I/flutter ( 7143): 执行完成
    //I/flutter ( 7143): main end
  }

//Future
  Future getNetworkDataHasFuture() async {
    print('请求中');
    return Future(() {
      sleep(Duration(seconds: 2));
      return "执行完成";
    });
  }
//   var result = getNetworkDataHasFuture();
//    result.then((value){
//      print(value);
//    });
//    print(result);
//    print("main end");

//  I/flutter ( 7419): 请求中
//  I/flutter ( 7419): Instance of 'Future<dynamic>'
//  I/flutter ( 7419): main end
//  I/flutter ( 7419): 执行完成

3.把工作放到后台线程执行。

分离的运行线程,不能访问主线程的变量,isolate不能共享内存。
如果执行长时间复杂任务,避免阻塞 event loop。
如果一个方法要花费几毫秒时间那么建议使用 Future 。
如果一个处理可能需要几百毫秒那么建议使用 isolate 。
rootIsolate和newIsolate之间的通信必须要暴露一个端口,必须知道彼此的端口。

//后台请求接口
   backGroundLoadData() async{
      ReceivePort rootIsolate = ReceivePort();//rootIsolate
      //为的是让newIsolate中持有rootIsolateSendPort 这样在newIsolate中就能向rootIsolate发送消息了
      await Isolate.spawn(dataLoader, rootIsolate.sendPort);//rootIsolateSendPort

      SendPort sendPort = await rootIsolate.first;//新的ReceivePort
      ReceivePort rootIsolateResponse = ReceivePort(); //第一个元素回收后监听会关闭,所以要新创建一个rootIsolateResponse
      sendPort.send(["https://jsonplaceholder.typicode.com/posts",rootIsolateResponse.sendPort]);
      List msg = await rootIsolateResponse.first;
      print(msg);
   }

   //newIsolate
  static dataLoader(SendPort rootSendPort) async {
    ReceivePort port = ReceivePort();//newIsolateReceivePort
    rootSendPort.send(port.sendPort);

    await for(var msg in port) {
      String data = msg[0];
      SendPort replyTo = msg[1];
      String dataUrl = data;
      http.Response response = await http.get(dataUrl);
      replyTo.send(json.decode(response.body));
    }
   }

4.CircularProgressIndicator()

相关文章

  • 3.flutter 线程和异步

    1.flutter是一个单线程,eventloop事件循环。支持Isolate async await 异步请求非...

  • 同步与异步 & 阻塞与非阻塞

    上篇说了线程,进程,cpu,内存,硬盘之间的关系,这篇说下异步和线程 异步 因为异步操作无须额外的线程负担,并且使...

  • 多线程

    同步、异步、并发、串行 同步和异步决定能否开启新的线程同步: 在当前线程中执行任务,不具备开启新线程的能力异步:在...

  • python爬虫常见面试题

    1、是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:...

  • iOS多线程

    一.概念 1.进程 2.线程 3.进程和线程的关系 4.多线程 5.主线程 6.同步 7.异步 同步和异步关注的是...

  • ios 中多线程同步之信号量

    1 需求: 开启两个主要异步线程,两个异步线程内部又得分别开启一个异步线程和其他耗时操作,最后还有第三个线程,这第...

  • python爬虫面试宝典(常见问题)

    是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:在访...

  • Python爬虫面试题

    1. 是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低线程异步:...

  • 几个常见的Python爬虫面试题,让我顺利拿下20k的offer

    是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:在访...

  • python爬虫面试 常见问题

    是否了解线程的同步和异步? 线程同步:多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低 线程异步:在访...

网友评论

      本文标题:3.flutter 线程和异步

      本文链接:https://www.haomeiwen.com/subject/jabkwrtx.html