일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 안드로이드 레트로핏 사용법
- 플러터 설치 2022
- 안드로이드 유닛 테스트 예시
- 자바 다형성
- 서비스 vs 쓰레드
- 2022 플러터 설치
- android retrofit login
- 스택 자바 코드
- 스택 큐 차이
- rxjava disposable
- ar vr 차이
- 안드로이드 유닛 테스트
- rxjava cold observable
- 서비스 쓰레드 차이
- android ar 개발
- 안드로이드 라이선스
- 클래스
- jvm 작동 원리
- jvm이란
- 안드로이드 os 구조
- 객체
- 멤버변수
- 안드로이드 레트로핏 crud
- Rxjava Observable
- 2022 플러터 안드로이드 스튜디오
- rxjava hot observable
- ANR이란
- 안드로이드 유닛테스트란
- 안드로이드 라이선스 종류
- 큐 자바 코드
- Today
- Total
목록책/코틀린 코루틴 (20)
나만을 위한 블로그
대부분 앱은 3계층으로 구분할 수 있다. 데이터 / 어댑터 계층도메인 계층표현 / api / UI 계층 각 계층에서 코루틴을 쓰는 일반적인 방법을 확인한다. 데이터 / 어댑터 계층 레포지토리, 프로바이더, 어댑터, 데이터 소스를 구현하는 계층이다.이 계층을 다루는 건 상대적으로 쉬운 편인데 인기 있는 여러 JVM 라이브러리가 기본적으로 or 몇 가지 의존성을 추가하는 걸로 코루틴을 지원하기 때문이다.레트로핏으로 요청을 정의한 함수를 블로킹 함수 대신 중단 함수로 만들려면 suspend를 추가한다. interface GithubApi { @GET("orgs/{organization}/repos?per_page=100") suspend fun getOrganizationRepos( @..
일반적으로 Flow는 콜드 데이터라 요청 시마다 값이 계산된다. 하지만 여러 수신자가 하나의 데이터가 바뀌는지 감지하는 경우도 있다. 이 때 메일링 리스트와 비슷한 SharedFlow를 쓴다. StateFlow는 감지 가능한 값과 비슷하다. SharedFlow SharedFlow로 메시지를 내보내면 대기 중인 모든 코루틴이 수신한다. import kotlinx.coroutines.coroutineScopeimport kotlinx.coroutines.delayimport kotlinx.coroutines.flow.MutableSharedFlowimport kotlinx.coroutines.launchsuspend fun main(): Unit = coroutineScope { val mutableS..
map Flow의 각 원소를 변환 함수에 따라 변환한다. 숫자들을 Flow로 갖고 있고 각 수의 제곱을 계산하는 연산이라면 생성된 Flow는 이 수들의 제곱을 값으로 갖는다. import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map suspend fun main() { flowOf(1, 2, 3) // [1, 2, 3] .map { it * it } // [1, 4, 9] .collect { print(it) }// 149 } map을 구현하려면 flow 빌더를 써서 새 Flow를 만들면 된다. 그리고 만들어진 Flow에서 원소들을 모으고 변형된 원소들을 하나씩 내보내면 된다. map은 값을 꺼내거나 다른 형태로 바꾸는 등으로 사용..
Flow는 요청이 한 방향으로 흐르고 요청으로 생성된 값이 다른 방향으로 흐르는 파이프라 할 수 있다. Flow가 끝나거나 예외 발생 시 이런 정보가 전달돼 중간 단계가 종료된다. 모든 정보가 Flow로 전달되므로 값, 예외, 시작 / 완료 등 다른 특정 이벤트를 감지할 수 있다. 아래 메서드들을 쓰면 된다. onEach Flow의 값을 하나씩 받기 위해 쓴다. import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.onEach suspend fun main() { flowOf(1, 2, 3, 4) .onEach..
원시값을 갖는 플로우 Flow를 만드는 가장 간단한 방법은 플로우가 어떤 값을 가져야 할지 정의하는 flowOf()를 쓰는 것이다. listOf()와 비슷하다. import kotlinx.coroutines.flow.flowOf suspend fun main() { flowOf(1, 2, 3, 4, 5) .collect { println(it) } } // 1 // 2 // 3 // 4 // 5 값이 없는 Flow가 필요하면 emptyFlow()를 쓰면 된다. emptyList()와 비슷하다. import kotlinx.coroutines.flow.emptyFlow suspend fun main() { emptyFlow() .collect { println(it) } } // 아무것도 출력되지 않음 컨버..
Flow는 비동기적으로 계산해야 할 값의 스트림을 나타낸다. Flow 인터페이스 자체는 떠다니는 원소들을 모으고 Flow의 끝에 도달할 때까지 각 값을 처리한다. Flow의 collect는 컬렉션의 forEach와 비슷하다. 이 함수는 Flow의 유일한 멤버 함수고 다른 함수들은 확장 함수로 정의돼 있다. iterator만 멤버 함수로 가진 Iterable 또는 Sequence와 비슷하다. 플로우와 값들을 나타내는 다른 방법들 비교 Flow 개념은 RxJava, Reactor를 쓴다면 잘 알겠지만 그 외의 사람들에겐 아니다. 여러 값을 리턴하는 함수가 필요하다고 가정한다. 한 번에 모든 값을 만들 때는 List, Set 같은 컬렉션을 쓴다. fun allUsers(): List = api.getAllUs..
채널은 값을 핫 스트림으로 갖지만 콜드 스트림이 필요할 때가 있다. 우리가 쓰는 대부분의 소스는 2종류로 구분할 수 있어서 핫 / 콜드 스트림 데이터 차이를 이해하는 게 소프트웨어 측면에서 유용하다. List, Set 등의 컬렉션은 핫이고 Sequence, 자바 스트림은 콜드다. 채널은 핫이지만 Flow, Observable, Single 같은 RxJava 스트림은 콜드다. 핫 vs 콜드 핫 데이터 스트림은 열정적이라 데이터 소비와 무관하게 원소를 생성하지만 콜드 데이터 스트림은 게을러서 요청이 있을 때만 작업하고 아무것도 하지 않는다. 핫인 리스트, 콜드인 시퀀스를 쓸 때 그 차이가 나온다. 핫 데이터 스트림의 빌더와 연산은 즉시 실행된다. 콜드 데이터 스트림에선 원소가 필요할 때까지 실행되지 않는다...
코루틴은 가장 먼저 완료되는 코루틴의 결과를 기다리는 select 함수를 제공한다. 또한 여러 채널 중 버퍼에 남은 공간이 있는 채널을 먼저 확인해서 데이터를 보내거나 이용 가능한 원소가 있는 채널로부터 데이터를 받을 수 있는지 확인할 수 있다. 지연되는 값 선택 여러 소스에 데이터를 요청한 뒤 가장 빠른 응답만 얻는 경우를 생각한다. 가장 쉬운 방법은 요청을 여러 비동기 프로세스로 시작하고 select 함수를 표현식으로 사용하고, 표현식 안에서 값을 기다리는 것이다. select 안에선 select 표현식에서 나올 수 있는 결과값을 명시하는 Deferred 값의 onAwait()를 호출한다. 람다 안에서 값을 바꿀 수도 있다. 아래 예에서 비동기 결과값 하나만 리턴하는 걸 볼 수 있는데 select 표..
코루틴끼리의 통신을 위한 기본적 방법으로 채널 api가 추가됐다. 채널은 송신자, 수신자 수에 제한이 없고 채널로 전송된 모든 값은 단 한 번만 받을 수 있다. 채널은 서로 다른 2개의 인터페이스를 구현한 하나의 인터페이스다. SendChannel : 원소를 보내거나 더하거나 채널을 닫기 위해 사용 ReceiveChannel : 원소를 받거나 꺼낼 때 사용 public interface SendChannel { public suspend fun send(element: E) public fun close(cause: Throwable? = null): Boolean } public interface ReceiveChannel { public suspend fun receive(): E public fun..
CoroutineScope 팩토리 함수 CoroutineScope는 coroutineContext를 유일 프로퍼티로 갖는 인터페이스다. public interface CoroutineScope { public val coroutineContext: CoroutineContext } CoroutineScope 인터페이스를 구현한 클래스를 만들고 내부에서 코루틴 빌더를 직접 호출할 수 있다. import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlin.coroutines.CoroutineContext class SomeClass: CoroutineScope {..