일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- recyclerview
- HTTP
- notification
- sqlite
- onMeasure
- 백준
- BOJ
- 알림
- kotlin
- Algorithm
- CustomView
- Coroutine
- onLayout
- Behavior
- room
- ViewModel
- CollapsingToolbarLayout
- Navigation
- 코틀린
- DataBinding
- View
- 안드로이드
- LiveData
- Android
- 알고리즘
- AppBarLayout
- activity
- hilt
- lifecycle
- CoordinatorLayout
- Today
- Total
목록Coroutine (7)
개발일지
Flow Flow는 Coroutine에서 여러 값을 순차적으로 보내는 유형입니다. Jetpack에서도 많이 쓰이는 유형이고, Iterator와 비슷하며 map, filter등 람다 함수를 지원하면서 suspend 함수에서 쓰이기 때문에 비동기 처리에 효율적입니다. Flow 구성 Producer : Flow Builder에서 비동기적으로 데이터를 생산한다. Intermediary : Stream에서 보내는 데이터를 소비하지 않고 수정한다. Consumer : 값을 사용한다. Producer Flow Builder를 통해 만든다. flow, channelFlow등 다양한 함수가 존재한다. Builder를 통해 Data를 만들고 emit을 통해 Data를 전달한다. Consume하는 함수가 수행될 때마다 Fl..
ViewModelScope ViewModel마다 존재하는 Scope이다. ViewModel이 삭제되면 자동으로 취소된다. class ExampleViewModel : ViewModel() { init { viewModelScope.launch { /* ViewModel이 사라지면 종료된다. */ } } } LifeCycleScope LifeCycle 객체마다 존재하는 Scope이다. Create, Start, Resume 3가지의 Mode를 지원하고 Active상태(화면에 보이는 상태)일 때만 수행된다. class CoroutineFragment : BaseFragment(R.layout.fragment_coroutine) { private var count = 0 private val logList b..
allowMainThreadQueries Room에서 기본적으로 Main Thread에서 접근할 수 없지만, allowMainThreadQueries를 사용하여 만든 Instance에서는 Main Thread에서도 접근할 수 있다. => Database를 접근하는 작업은 무거운 작업이고 UI를 오랫동안 잠글 수 있기 Main Thread에서 접근하는 것은 좋지 않다. AppDatabase package com.taetae98.room.singleton import android.content.Context import androidx.room.CoroutinesRoom import androidx.room.Database import androidx.room.Room import androidx.room..
Coroutine에 접근하기 위해서는 CoroutineScope를 사용해서 접근해야 한다. CoroutineScope는 interface형식으로 정의되어 있고, CoroutineContext를 사용해서 생성하거나, 미리 정의된 GlobalScope를 사용할 수 있다. GlobalScope GlobalScope는 별도의 생명주기가 없고, 실행되면 작업이 종료되거나 앱이 종료될 때까지 남아있는다. fun main() = runBlocking { GlobalScope.launch { println("Running on GlobalScope ${Thread.currentThread().name}") } delay(1000L) } Running on GlobalScope DefaultDispatcher-worke..
cancel() Job을 취소시키는 함수, Job이 취소되었을 때 suspend 함수를 호출하면 JobCancellationException을 발생시킨다. fun main() = runBlocking { val job = launch { repeat(5) { try { delay(1000L) println("Job Run Index($it)") } catch (e: Exception) { e.printStackTrace() } } } delay(3000L) job.cancel() job.join() } Job Run Index(0) Job Run Index(1) kotlinx.coroutines.JobCancellationException: StandaloneCoroutine was cancelled; ..
코루틴 빌더 runBlocking { } -> 해당 코루틴이 끝날 때 까지 Blocking한다. fun main() { // delay(1000L)가 실행되는 동안 main함수가 끝나고 println을 만나지 못하고 종료 GlobalScope.launch { delay(1000L) println("Pass") } } Process finished with exit code 0 fun main() { GlobalScope.launch { delay(1000L) println("Pass") } runBlocking { // delay(2000L)이 끝날 때 까지 Blocking 된다. delay(2000L) } } Pass Process finished with exit code 0 launch { } ->..
Gradle 설정 dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7") } Thread vs Coroutine Thread와 Coroutine은 동시성을 보장하기 위한 기술이다. Thread Preempting Scheduling 자원을 서로 차지하려고 노력하고 OS가 Context Switching을 통해 Thread에게 자원을 할당한다 -> Overhead발생 Thread자체 Stack메모리를 가지고 JVM Stack을 차지한다. Coroutine Cooperatively 처리 단위가 Thread가 아닌 Coroutine에서 제공하는 Job Object단위로 하나에 Thread에서 진행된다. Thread..