전체 글 (53) 썸네일형 리스트형 Kotlin Channel - 코루틴간 데이터 통신 Channel 이란? 앞에서 본 Flow가 단일방향으로 데이터를 던지고 받는 형식이라면 Channel 은 여러 방향에서 데이터를 던지고 받는 형식으로 코루틴 끼리의 데이터를 전달하기 위한 위한 친구이다. 구조는 BlockingQueue 와 비슷하며, 동일하게 ThreadSafe 한 형태의 구조를 가지고 있다. 기본적인 사용법 기본적인 사용법은 간단하다. val channel = Channel() CoroutineScope(Dispatchers.Default).launch { channel.send(it) channel.receive() } channel.close() Channel() 함수를 통해 생성할 수 있으며, 데이터를 스트림에 밀어 넣을 땐 send, 스트림에서 받을 땐 receive 를 사용하면.. Espresso intents - 카메라 촬영 테스트 하기 오늘은 에스프레소 테스트 도중에 카메라 촬영을 진행하는 방법을 알아보자. 시작하기 전에 만에 하나라도 카메라에 보이는 장면을 실제로 촬영하기를 원한다면 에스프레소만으로는 불가능하며 카메라 기능을 직접 구현하거나, 내가 직접 만든 카메라 앱과 함께 테스트하거나 두 가지 방법뿐이다. ( 물론 본인이 모든 카메라 앱의 버튼의 위치나 버튼 ID를 때려 맞출 자신이 있다면 가능하다. ) 그러니, 만약 그런 걸 원한다면 정신건강에 매우 해롭기 때문에, 깔끔하게 에스프레소랑은 거리를 두자. 우리의 목적은 인텐트를 조작하여 카메라가 실제로 촬영된 것처럼 돌아가도록 로직을 만들 것이다. 라이브러리 androidTestImplementation 'androidx.test.espresso:espresso-intents:3... Android - java.time 패키지 안드로이드에서도 자바 8 지원으로 java.time 패키지를 사용할 수 있게 되었다. 이제 문제 덩어리 였던 Calender 버리고 java.time 패키지의 새로운 클래스인 LocalTime, LocalDate, LocalDateTime 들을 사용하면 된다. 코드는 전반적으로 joda-time 과 유사한 형태를 이루고 있고, 추가적인 개선이 이루어졌다고 한다. Java 8 은 gradle 에 아래와 같이 추가 하면 사용할 수 있다. compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } 날짜, 시간 가져오.. Kotlin Flow #4 - onXXX 함수와 예외처리 이번에는 알아볼 것은 플로우에서 시작, 완료, 에러 등의 상태 처리 등을 하는 함수들이다. 시작할 때 flowOf(1, 2, "String", 3).onStart { emit("Start1!!!") }.onStart { emit("Start2!!!") }.collect { println(it) } result : Start1!!! Start2!!! 1 2 String 3 onStart 함수는 Flow 가 실행을 시작할 때 특정 데이터를 방출할 수 있도록 지원한다. 선언 위치는 사용전이면 상관없으며 여러 번 사용하면 순서대로 전부 실행된다. 비어있을 때 emptyFlow().onEmpty { emit("is Not Empty") }.collect { println(it) } result : is Not E.. Kotlin Flow #3 - Zip And Combine Rx에서 zip이나 combineLatest 등으로 여러 응답을 결합하여 사용하듯이, 코틀린에서도 여러 개의 Flow를 결합하여 사용할 수 있는 함수를 제공한다. Flow 함께 사용하기 1. Zip val nums = (1 .. 3).asFlow() val strs = flowOf("one", "two", "three", "four").onEach { delay(1000) println("str") } nums.zip(strs) { a, b -> "$a -> $b" }.collect{ delay(1000) println(it) } result : 1 -> one 2 -> two 3 -> three 첫 번째 방법으로 zip 을 이용할 수 있다. zip 은 결합된 모든 Flow 가 데이터를 방출하기를 기다리.. Kotlin Flow #2 - 연산자들 Flow에서 사용할 수 있는 다양한 연산자들을 정리한다. 아래 나오는 연산자들은 Flow 나 데이터의 조작을 위한 것으로 따로 실행을 시키지 않는다면 아무런 동작도 시작하지 않는다. ( collect, launchIn 등등 ) 개수 제한 연산자 (1..3).asFlow().take(2).collect{ println("$it") } take 연산자는 특정 개수까지만 데이터를 받고 싶을 때 사용하는 연산자이다. 지정한 개수까지만 방출한 후에 남은 데이터에 상관없이 Flow는 자동으로 취소된다. 숫자를 마이너스로 넣을 경우 에러가 발생한다. 버퍼 연산자 private fun getNumbers(): Flow = flow { for (i in 1..5) { delay(200) emit(i) } }.flowOn.. Kotlin Flow #1 - 기본 사용법 Flow 란? 코틀린 플로우는 suspend function을 보완하기 위해 나온 친구이다. 비동기 동작의 결과로 suspend function 이 하나의 결과물 던진다면, 플로우를 이용하여 여러 개의 결과를 원하는 형식으로 던질 수 있다. 특징 비동기이며 코루틴에서만 동작 가능한 것은 suspend function 과 동일하다. 다른 점은 함수 앞에 suspend 를 붙이지 않아도 된다. cold stream ( kotlin의 sequence )으로 동작하며 hot stream 은 지원하지 않는다. 그렇기에 데이터는 요청할 때마다 처음부터 새로 발행되며, 요청 전에는 선언만 있을 뿐 아무런 동작도 하지 않는다. 직접 취소할 수 있는 함수는 따로 제공하지 않는다. Flow 생성 우선 Flow를 생성하는 .. Android Hilt - WorkManager Dagger - Hilt 에 이어서 Hilt에서 워크 매니저에게 주입하는 법을 알아보려 한다. 방법은 간단한데, 굳이 작성한 이유는 "E/WM-WorkerWrapper: Could not create Worker" 에러 때문이다. 시작하기 implementation 'androidx.hilt:hilt-work:1.0.0-alpha01' 워크 매니저를 힐트와 함께 사용하려면 위의 라이브러리를 추가해야 한다. WorkFactory 설정하기 @HiltAndroidApp class UsageApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getW.. 이전 1 2 3 4 5 6 7 다음 목록 더보기