반응형

분류 전체보기 67

[Kotlin] StateFlow subscriptionCount 구독자 수 확인

StateFlow는 Hot stream으로 구독 여부와 상관없이 데이터를 발행합니다. 그래서 경우에 따라 비효율적인 동작이 될 수 있습니다. subscriptionCount로 구독자 수를 확인할 수 있습니다. 구독자 수를 확인하여 데이터 발행 유무를 판단하면 더 효율적인 동작을 만들 수 있습니다. Cold Stream과 Hot Stream 차이는 아래 포스팅에서 확인할 수 있습니다. 2021.10.05 - [Kotlin] - [Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점 아래 예제는 구독자가 있는 경우 onActive()를 호출하고 구독자가 생기면 onInactive()를 호출합니다. onActive()가 호출 될 경우 데이터 발행을 처리하고 onInactive(..

Kotlin 2021.10.15

[Kotlin] Type checks와 형변환(casts)

is와 !is 연산자 is 연산자와 !is 연산자는 object가 주어진 type인지 Runtime에 확인(checks)해줍니다. if (obj is String) { print(obj.length) } if (obj !is String) { //!(obj is String) 와 같습니다. print("Not a String") } else { print(obj.length) } Smart casts 대부분 Kotlin에서 명시적으로 형변환(Explicit casts)할 필요는 없습니다. 컴파일러가 is -checks를 추적하고 불변의 값(immutable values)이 명시적으로 형변환(cast)이 필요하면 safe casts를 자동으로 넣어줍니다. fun demo(x: Any) { if (x is ..

Kotlin 2021.10.06

[Kotlin] Cold Stream(flow), Hot Stream(flow) 차이점

Flow를 사용하다 보면 Cold Stream, Hot Stream 이란 용어를 들어볼 수 있습니다. Cold Stream, Hot Stream의 차이점을 정리하겠습니다. Cold Stream 하나의 소비자(Consumer)에게 값을 보냅니다. 생성된 이후에 누군가 소비하기 시작하면 데이터를 발행합니다. 예를 들어 상태가 변하지 않는 값을 읽을 때 데이터베이스를 읽거나 URL을 통해서 서버 값을 읽는 경우 Cold Stream으로 구현할 수 있습니다. Hot Stream 하나 이상의 소비자(Consumer)에게 값을 보낼 수 있습니다. 데이터 발행이 시작된 이후 부터 모든 소비자에게 같은 데이터를 발행하고 구독자가 없는 경우에도 데이터를 발행합니다. 예를 들어 상태가 변하는 값을 읽을 때 네트워크 상태 ..

Kotlin 2021.10.05

error: [Dagger/MissingBinding] @dagger.hilt.android.qualifiers.ApplicationContext android.content.Context cannot be provided without an @Provides-annotated method. 해결 방법

error: [Dagger/MissingBinding] @dagger.hilt.android.qualifiers.ApplicationContext android.content.Context cannot be provided without an @Provides-annotated method. Hilt library를 처음 사용하다보면 위와 같은 Error Message가 발생하는 경우가 있습니다. 종송적으로 주입하려는 객체를 Hilt에 알려주지 않은 경우 에러가 발생합니다. 위 경우는 Context를 주입받고 싶은데 Constructor-inject할 때 @ApplicationContext나 @ActivityContext Annotation을 넣지 않은 경우에 발생합니다. 아래와 같이 @Applicati..

Android 2021.09.27

[Android] Hilt @Binds, @Providers 차이점

Android에서 의존성 주입(DI / Dependency Injection)을 도와주기 위해서 Hilt 라이브러리를 제공해 줍니다. Hilt 라이브러리를 사용하면 의존성 주입을 위해 Android 프로젝트에 컨테이너를 제공하고 수명 주기(Life cycle)를 자동으로 관리하여 불필요한 클래스 생성이나 자원관리에 도움을 받을 수 있습니다. Hilt 모듈 Hilt 라이브러리에서 Constructor-inject(생성자 삽입) 삽입을 할 수 없는 경우 Hilt 모듈(@Module)을 사용하여 Hilt에 Binding 정보를 제공해줄 수 있습니다. 이때 Hilt 모듈은 @Binds와 @Providers로 Hilt binding 정보를 제공해줄 수 있습니다. @Binds와 @Providers의 눈에 보이는 큰..

Android 2021.09.27

Kotlin callbackFlow callback listener의 데이터를 Coroutines flow로 보내기

Android에서 callback listener를 코루틴(Coroutines) flow로 보내는 방법을 포스팅합니다. Android에서 이벤트가 호출될 때 listener를 통해 응답을 처리합니다. Flow를 이용하여 데이터 흐름을 만드려고할 때 listener를 통해 받은 값을 flow로 보낼 수 없습니다. Flow와 listener 내부의 scope가 다르기 때문에 listener내부에서 emit을 사용하여 바로 데이터를 보낼 수 없습니다. (Suspension functions can be called only within coroutine body) 이러한 경우 callbackflow를 사용하여 listener 내부 값을 flow로 보낼 수 있습니다. listener 내부에서 offer함수를 호..

Kotlin 2021.09.13

Kotlin KAPT(Kotlin Annotation Processing Tool) 이란

kotlin KAPT(Kotlin Annotation Processing Tool)에 대한 글입니다. Kotlin에서 Annotation처리를 위해서 KAPT(Kotlin Annotation Processing Tool)을 제공합니다. Project 내부에서 Hilt, Room, Databinding 등 library가 사용된다면 기존에 annotationProcessor에서 kapt로 바꾸어 선언하는 게 필요합니다. Kotlin은 kotlinc로 컴파일되기 때문에 기존에 Java로 작성된 Annotation Process로는 Kotlin의 Annotation이 제대로 처리되지 않습니다. 예를 들어 Android의 Room library를 사용하다가 아래와 같은 Exception을 만날 수도 있습니다. ..

Android 2021.09.13

[Android] PID(Process ID)/UID(User ID) ADB로 확인하는 방법

Android의 ADB를 사용하여 PID와 UID를 확인하는 방법입니다. PID는 Process ID로 Android App이 실행되어 프로세스가 생성되는 시점에 할당받습니다. UID는 User ID로 Android App을 설치하면 AndroidManifest에 있는 Package name으로 할당됩니다. ADB 명령어로 특정 Package의 PID를 찾는 방법 adb shell pidof PACKAGE_NAME 예제 adb shell pidof com.google.android.youtube 15704 shell의 ps를 사용하여 PID 찾는 방법 두 번째 값이 PID입니다. adb shell "ps -ef | grep com.google.android.youtube" u0_a238 15704 807..

Android 2021.09.07

[Android] logcat chatty 로그가 제대로 출력되지 않을 때 expire 1 line

에러 메시지 03-06 10:21:11.147 13050 13050 I chatty : uid=10238(com.google.android.youtube) expire 1 line Android APP에서 로그를 찍을 때 logcat에 수 초안에 많은 양의 로그를 찍으면 즉시 그 앱의 로그가 출력되지 않고 줄어드는 경우가 있습니다. logcat의 과부하를 방지하기 위해서 제약을 둔 것으로 보입니다. Logcat에 App정보를 white list로 등록하면 로그 유실이나 출력방지를 피할 수 있습니다. PID나 UID로 Logcat에 white list를 등록할 수 있습니다. PID나 UID를 확인하는 방법은 아래 포스팅에서 확인할 수 있습니다. 2021.09.07 - [Android] - [Android]..

Android 2021.09.07

[Kotlin] 기본적인 구문 - 2

Kotlin의 기본적인 구문(Basic syntax)에 대한 정리입니다. 2021.09.03 - [Kotlin] - [Kotlin] 기본적인 구문 - 1 [Kotlin] 기본적인 구문 - 1 Kotlin의 기본적인 구문(Basic syntax)에 대한 정리입니다. 패키지 정의와 imports 방법(Package definition and imports) 기본적으로 Java와 동일하게 패키지명은 소스파일의 맨 위에 작성합니다. package three.. 3edc.tistory.com 조건 표현식(Conditional expressions) fun maxOf(a: Int, b: Int): Int { if (a > b) { return a } else { return b } } Kotlin에서 if를 표현식..

Kotlin 2021.09.07

[Kotlin] 기본적인 구문 - 1

Kotlin의 기본적인 구문(Basic syntax)에 대한 정리입니다. 패키지 정의와 imports 방법(Package definition and imports) 기본적으로 Java와 동일하게 패키지명은 소스파일의 맨 위에 작성합니다. package three.sal import java.util.* 프로그램 진입점(Program entry point) 일반적인 언어들과 동일하게 프로그램은 main() 함수부터 시작됩니다. fun main() { println("Hello world!") } String 리스트를 인자로 받는 main함수는 아래와 같습니다. fun main(args: Array) { println(args.contentToString()) } Print 표준 출력 print("Hello..

Kotlin 2021.09.03

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ 해결하기

MalformedJsonException을 해결하는 방법을 포스팅하겠습니다. Java에서 Json data를 처리하기 위해서 Gson library를 사용할 수 있습니다. Gson을 사용하다 보면 MalformedJsonException이 발생하는 경우가 있습니다. Restful API를 지원하는 서버와 통신하기 위해서 Retrofit/Gson을 사용하는 경우에도 발생할 수 있습니다. Retrofit에서 request/response body의 Json 객체를 처리하기 위해서 어떤 json libarary를 선택할 수 있는데 Retrofit 예제 코드에도 나와있듯이 gson을 많이 사용합니다. Retrofit, gson을 사용할 때 발생할 수 있습니다. MalformedJsonException이 발생한 ..

Java 2021.09.02
반응형