본문 바로가기

개발(합니다)/Flutter&android&ios

[flutter-15] Future-async 심화

반응형

Thread

  • 프로세스내에서 실행하는 흐름의 단위

Procees vs Program

  • Photoshop은 하나의 프로그램이며 실행시키면 생명을 얻어 하나 이상의 프로세스를 가지게 됩니다.
  • Process는 앱의 동작을 담당하는 역할을 가집니다.

Event loop

  • Dart는 싱글 스레드로 운영되는 언어이며 Flutter는 Dart를 기반으로 합니다.
  • Event loop의 수행 방식
    1. First In First Out 방식으로 "MicroTask와 Event"를 준비
    2. main 함수 실행
    3. Event loop 실행
  • MicroTask는 이벤트 큐로 넘어가기 전에 비동기적으로 실행되고 종료되는 작은 작업 단위입니다.
  • 외적인 Event가 발생하면 순차적으로 큐에 등록하여 처리합니다.
    • ex) gesture, drawing, files, Reading, data, Fetching, Button tap, Future, Stream

Futrue

  • 작동 순서
    1. 다트에 의해서 future 객체가 내부적인 배열에 등록
    2. Future 관련해서 실행되어야 하는 코드들이 이벤트 큐에 등록
    3. 불완전한 Future객체가 반환
    4. Synchronous 방식으로 실행되어야 할 코드 먼저 실행
    5. 최종적으로 실제적인 data값이 future 객체로 전달
main() {
  print('before1');

  Future(() {
    print("running");
  }).then((_) => print('than'));
  print("test");

}

Async method

  • 메서드를 통해서 나오는 결과물은 Future
  • await 키워드를 만날때까지 synchronous 방식으로 코드처리
  • await 키워드를 만나면 future가 완료될 때까지 대기
  • future가 완료 되자마자 그 다음 코드들을 실행
main() async{
  print('fetcing..');
  print(await createOrderMessage());
  print('end');
}

Future<String> createOrderMessage() async{
  print('synchronous');
  var order = await fetchUserOrder();
  return 'Your order is : $order';

}

Future<String> fetchUserOrder() {
  return Future.delayed(Duration(seconds: 2), () => 'Large Latte');
}

void main() async {
  methodA();
  await methodB();
  await methodC("C");
  methodD();
}

void methodD() {
  print('D');
}

methodC(String s) async{
  print('C start from $s');
  Future(() {
    print('C running Future from $s');
  }).then((_) => print('C end of Future from $s'));

  print('C end from $s');
}

methodB() async {
  print('B starts');
  await methodC("B");
  print('B end');
}

void methodA() {
  print("A");
}

import 'package:flutter/material.dart';
import 'package:week4_app/login_app/firebaseTest.dart';

main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Futrue',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyHome(),
    );
  }
}

class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  String result = 'no data';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Future test"),
      ),
      body: Center(
        child: Padding(
          padding: EdgeInsets.all(30.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              RaisedButton(
                onPressed: () {
                  futureTest();
                },
                child: Padding(
                  padding: EdgeInsets.all(8.0),
                  child: Text(
                    'Future Text',
                    style: TextStyle(fontSize: 20.0),
                  ),
                ),
              ),
              SizedBox(
                height: 20.0,
              ),
              Text(
                result,
                style: TextStyle(fontSize: 20.0, color: Colors.redAccent),
              ),
              Divider(
                height: 20.0,
                thickness: 2.0,
              ),
              FutureBuilder(builder: (context, snapshot) {
                if(snapshot.connectionState == ConnectionState.done) {
                  print(snapshot);
                  return Text(snapshot.data, style: TextStyle(fontSize: 20.0, color : Colors.blue),);
                }
                return CircularProgressIndicator();

              }, future: myFuture(),)
            ],
          ),
        ),
      ),
    );
  }

  Future<void> futureTest() async {
    print("start");
    await Future.delayed(Duration(seconds: 3)).then((_) {
      print("future");
      setState(() {
        this.result = 'The data is fetched';
        print("result");
        print("setState end");
      });
    });
    print("futureTest");
  }

  Future<String> myFuture() async {
    await Future.delayed(Duration(seconds: 2));
    return 'another Future';
  }

}

 

반응형