안드로이드/Android 비동기 처리 8

[Android] 코루틴 플로우(Coroutine Flow)에 대해 알아보자

Android 코루틴 플로우(Coroutine Flow)에 대해 알아보자 # flow { ... } public fun flow(@BuilderInterface block: suspend FlowCollector.() -> Unit) : Flow = SafeFlow(block) flow { // 플로우 블럭 } 하나의 소비자(Consumer)에게 값을 보냅니다. 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행합니다. # 플로우 기초 플로우 기초 플로우 기초 플로우 기초 예제 45: 처음만나보는 플로우 Flow는 코틀린에서 쓸 수 있는 비동기 스트림입니다. import kotlin.random.Random import kotlinx.coroutines.* import kotlinx.coroutines..

[Android] CoroutineScope, CoroutineContext, CoroutineBuilder, suspend Function

#CoroutineScope 코루틴이 실행되는 범위로, 코루틴을 실행하고 싶은 Lifecycle에 따라 원하는 Scope를 생성하여 코루틴이 실행될 작업 범위를 지정할 수 있습니다. 사용자 지정 CoroutineScope: CoroutineScope(CorountineContext) ex) CoroutineScope(Dispatchers.Main) // Dispatchers.Main, Dispatchers.Default, Dispatchers.IO, Job()... // 메인 쓰레드에서 실행될 사용자 정의 Scope val scope = CoroutineScope(Dispatchers.Main) scope.launch { // 메인 쓰레드 작업 } // 백그라운드에서 실행될 사용자 정의 Scope Cor..

[Android] Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3

Coroutine StateFlow, Flow, LiveData, ViewModelScope, LifecycleScope + Paging3 StateFlow와 SharedFlow는 흐름에서 최적으로 상태 업데이트를 내보내고 여러 소비자에게 값을 내보낼 수 있는 Flow API입니다. # StateFlow 현재 상태와 새로운 상태 업데이트를 수집기에 내보내는 관찰 가능한 상태 홀더 흐름입니다. value속성을 통해서도 현재 상태 값을 읽을 수 있습니다. 상태를 업데이트하고 흐름에 전송하려면 MutableStateFlow 클래스의 value 속성에 새 값을 할당합니다. private val _uiState = MutableStateFlow(LatestNewsUiState.Success(emptyList())..

비동기 처리(process&thread)

# concurrency 비동기적으로 작업을 처리하기 위해서는 동시에 작업을 처리해야한다. 이것을 Concurrent computing이라 하며 흔히 동시성이라 부른다. 동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함한다. 우리가 흔히 ‘동시’라고 이야기 하지만 컴퓨터(코어)는 한번에 하나의 명령어만 처리할 수 있다. 즉, 두개 이상의 알고리즘이 하나의 코어내에서 스레드간에 빠르게 교차되면서 실행되기 때문에 ‘동시’라고 느끼는 것이다. 순차적으로 작업을 처리하면 비효율적이다. 어떤 작업을 할때 기다려야하고 하드웨어 리소스를 낭비한다. -> 동시에 실행하고자 하는 요구가 생겨났다. # process & thread ..

Coroutine suspend function

코루틴은 일시중단이 가능하다. launch로 실행하든 async로 실행하든 내부에 해당 코루틴을 일시 중단 해야하는 동작이 있으면 코루틴은 일시 중단 된다. # suspend 사전적 의미로는 '중지하다'라는 뜻이다. coroutine에서는 시작하고, 멈추고, 다시 시작할 수 있는 함수라고 한다. suspend란 비동기 실행을 위한 중단 지점의 의미 즉, 잠시 중단(suspend)한다는 의미이고, 잠시 중단 후에 다시 시작(resume) 된다는 뜻 # Suspend function이 없다면? 하나의 thread가 block될 경우, 해당 thread는 다른 작업을 할 수 없는 block상태에 놓이게 된다. 즉, blocked 상태가 끝날 때까지 해당 thread는 중지 상태인 것. 하지만, suspend..

CoroutineContext

# CoroutineContext Coroutine(코루틴)을 어떻게 처리할 것인지에 대한 여러가지 정보(Element)를 포함 -> Element의 집합 CoroutineContext는 Interface로, 코루틴에 대한 설정 요소(Element)를 등록하고 Scope의 속성이 된다. 말이 너무 어렵다.. -> CoroutineContext는 Coroutine이 실행되는 환경이라고 생각하면 된다. CoroutineContext 인터페이스 내부에는 4가지의 메소드가 존재 public operator fun get(key: Key): E? get() - 연산자(operator) 함수의 의미로, 매개변수로 주어진 key에 해당하는 Context 요소를 반환하는 함수 public fun fold(initial..

코루틴 Coroutine

# Coroutine Android Developer 에서의 정의 “비동기적으로 실행되는 코드를 간소화 하기 위해 Android 에서 사용할 수 있는 동시 실행 설계 패턴” 코루틴은 Android의 비동기 프로그래밍에 권장되는 솔루션입니다. 주목할 만한 기능은 다음과 같습니다. 경량: 코루틴을 실행 중인 스레드를 차단하지 않는 *정지*를 지원하므로 단일 스레드에서 많은 코루틴을 실행할 수 있습니다. 정지는 많은 동시 작업을 지원하면서도 차단보다 메모리를 절약합니다. 메모리 누수 감소: *구조화된 동시 실행*을 사용하여 범위 내에서 작업을 실행합니다. 기본으로 제공되는 취소 지원: 실행 중인 코루틴 계층 구조를 통해 자동으로 취소가 전달됩니다. Jetpack 통합: 많은 Jetpack 라이브러리에 코루틴을..

비동기 처리 - 블로킹과 논블로킹

# Android Single Thread 안드로이드의 애플리케이션을 실행하면 시스템은 메인 액티비티를 메모리로 올려 프로세스를 만들며, 이 때 메인 스레드가 자동으로 생성 메인 스레드는 안드로이드의 주요 컴포넌트를 실행하는 곳이자 UI를 그리거나 갱신하는 일을 담당 하지만. 이 스레드만으로는 원하는 작업을 모두 처리할 수 없음. 왜냐면 긴 작업은 메인 스레드를 블럭할 수 있음. 따라서 안드로이드는 비 동기적으로 실행되는 코드를 작성해야만 함. 화면에 무엇인가를 표시하는 작업 말고, 내부적으로 돌아가는 작업이 필요함. # sync, async, blocking, non-blocking # Blocking(블로킹)과 Non-blocking(논블로킹) 1) 블로킹 블로킹은 A 함수가 B 함수를 호출하면, 제..