반응형
Thread
- 프로세스내에서 실행하는 흐름의 단위
Procees vs Program
- Photoshop은 하나의 프로그램이며 실행시키면 생명을 얻어 하나 이상의 프로세스를 가지게 됩니다.
- Process는 앱의 동작을 담당하는 역할을 가집니다.
Event loop
- Dart는 싱글 스레드로 운영되는 언어이며 Flutter는 Dart를 기반으로 합니다.
- Event loop의 수행 방식
- First In First Out 방식으로 "MicroTask와 Event"를 준비
- main 함수 실행
- Event loop 실행
- MicroTask는 이벤트 큐로 넘어가기 전에 비동기적으로 실행되고 종료되는 작은 작업 단위입니다.
- 외적인 Event가 발생하면 순차적으로 큐에 등록하여 처리합니다.
- ex) gesture, drawing, files, Reading, data, Fetching, Button tap, Future, Stream
Futrue
- 작동 순서
- 다트에 의해서 future 객체가 내부적인 배열에 등록
- Future 관련해서 실행되어야 하는 코드들이 이벤트 큐에 등록
- 불완전한 Future객체가 반환
- Synchronous 방식으로 실행되어야 할 코드 먼저 실행
- 최종적으로 실제적인 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';
}
}
반응형
'개발(합니다) > Flutter&android&ios' 카테고리의 다른 글
[flutter] firebase 연동하기 (0) | 2021.03.22 |
---|---|
[flutter-16] 날씨 앱 만들기 (0) | 2021.03.09 |
[flutter-14] 반복문 - For loop (2) | 2021.03.07 |
[flutter-13] 로그인과 주사위 놀이 만들기(위젯 리팩토링, future, async, await) (0) | 2021.03.05 |
[flutter-12] Stateful widget (1) | 2021.03.04 |