본문 바로가기
반응형

Android 개발251

Kotlin BuildList 사용방법 정리 buildList는 Kotlin의 표준 라이브러리에서 제공하는 함수인데요.오늘은 이것에 대해 정리하겠습니다. 1. BuildListbuildList 함수를 사용하면,MutableList에 아이템을 추가하거나 제거하는 등의 변화를 준 후,변경 불가능한(immutable) List로 리턴해 줍니다.  예제를 보면서 이해해 보겠습니다.buildList블록안에서,x라는 리스트의 앞과 뒤에,아이템을 추가하였습니다. val x = listOf('김', '이')val y = buildList() { add('박') addAll(x) add('마')}println(y) // ['박', '김', '이', '마']  2. 실제 코드 실제로 사용하는 코드를 볼까요?예전코드와,buildList를 사용하는 코드.. 2025. 2. 20.
Paging 라이브러리와 RecyclerView 그리고 Room 구현하기 오늘은 Paging 라이브러리와 RecyclerView,그리고 Room을 이용해 대량의 데이터를 구현하는 방법에 대해 알아보겠습니다. 1. Paging1-1. Paging라이브러리Android Paging Library는,앱에서 대량의 데이터를 표시하는 데 도움을 주는 라이브러리입니다.책을 페이지별로 나누어 보는 것처럼,데이터를 작은 덩어리(페이지)로 나누어서,필요한 부분만 불러와 보여주는 방식입니다. Paging이 필요한 시기는 언제일까요?처음 로드해야하는 데이터가, 50개 정도를 넘어선다면,Paging을 고려해 보아야 합니다. 1-2. Paging 라이브러리를 사용해야 하는 이유Paging라이브러리가, 데이터를 덩어리로 나누어주는 것만 하는 것이 아니고요.아래와 같은 역할에 대한 코딩을 줄여주기도 합.. 2025. 2. 19.
Kotlin Lateinit var와 By Lazy 차이 이해하기 오늘은 Kotlin의 lateinit var에 대해서 이해해 보겠습니다. 1. lateinit var vs by lazy먼저, lateinit var와 by lazy를 표로 비교해 보겠습니다.가변적이면서도 초기화 시점을 컨트롤 하는 lateinit var와,불변적이면서 사용시에 자동으로 초기화 되는 by lazy의 차이점이 보이시나요?  lateinit varby lazy선언 방식가변적, 초기화 후 변경 가능불변적(val), 초기화 후 변경 불가초기화 시점원하는 시점에 대입해서 명시적으로 초기화(초기화 시점에 null이면 Exception)첫 사용 시 자동 초기화기본타입 사용기본 타입 사용 불가모든 타입 사용 가능스레드 안전성보장하지 않음보장초기화 여부 확인::propertyName.isInitializ.. 2025. 2. 17.
Android 카메라 동적 권한 얻는 방법 정리 오늘은 Android에서는 카메라기능을 사용할 경우,단순히 권한을 선언하는 것으로는 부족하고요.동적으로 유저에게 승인을 얻어야 하는데요.오늘은 동적으로 권한을 얻는 방법에 대해 알아보겠습니다. 1. ManifestManifest에 Camera권한을 설정하지 않으면,아무리 동적권한을 구현해도 카메라기능은 동작하지 않습니다.manifest에 아래와 같이 권한을 요청해 둡니다.   2. 동적 권한 요청 구현그럼 실제로 동적 권한을 요청하는 코드를 볼까요? 2-1. permissionLauncher작성하기가장 먼저 할 일은,Activity(혹은 Fragment) 내에 아래와 같이,아래와 같이 permissionLauncher를 작성하는 일입니다.권한이 거부되면,사용자에게 권한이 필요하다고 알리는 다이얼로그.. 2025. 2. 17.
Android Studio 에서 기억해야 하는 핵심 단축키 안드로이드 스튜디오를 사용할 때 코드사용에 큰 도움을 주는 단축키들이 많이 있습니다.이런 것들은 자주 사용하면서 기억해 두면 생산성이 높아지는데 큰 도움을 주는데요.이 글에서 정리해 보도록 하겠습니다. 1.  찾기1-1. 전체 파일에서 코드 찾기아래 단축키로 특정코드를 전체 파일에서 찾아볼 수 있습니다.Command + Shift + F1-2. 클래스 파일 이름으로 찾기아래 단축키를 사용하면 클래스 파일만 이름으로 찾을 수 있습니다. Cmd + O 1-3. 파일이름으로 찾기기준을 클래스 파일이 아니라,모든 파일이름으로 할 경우는,다음 단축키를 사용해 줍니다.Cmd + Shift + O1-4. 모든 것을 기준으로 찾기파일이름, 클래스이름, 심볼이름, 텍스트 이름 등,모든 것을 기준으로 찾을 때는 아래 단축.. 2025. 2. 13.
Kotlin Smart Cast(스마트캐스트) 총정리 오늘은 Kotlin의 Smart Cast에 대해 정리하겠습니다. 1. Smart Cast(스마트 캐스트)Smart Cast(스마트캐스트)는 이름 자체에서 알 수 있듯이,컴파일러가 타입을 자동으로 추론해서,명시적으로 타입을 변환하지 않아도,사용하도록 해주는 기능입니다. 타입을 검사하고, 변환하는 것까지,자동으로 Smart하게 해주는 것 이지요. 이를 이용하면,코드가 짧아져 가독성이 좋아지고,유지보수성도 좋아집니다. 2. is를 사용한 Smart Cast2-1. is smart cast가장 기본적인 스마트 캐스트의 사용법은,is 키워드를 사용해,변수의 타입을 검사한 후,해당 타입으로 자동 캐스트하는 것 입니다. 아래는 'is'키워드를 사용해,any의 타입검사를 하고,String에 해당하면 String으로 변.. 2025. 1. 22.
StateFlow 정리 # Android Kotlin Coroutine getStateFlow StateIn 오늘은 Kotlin의 StateFlow 에 대해서 정리해 보도록 하겠습니다. StateFlow도 Flow API의 하나인데요.Flow에 대한 내용은 아래 글을 참조해 주세요.>> Kotlin Coroutine Flow 총정리 part3 # launchIn 이 글은 아래의 순서대로 정리되어 있습니다.StateFlowStateFlow 구현(학생 및 admin 등록과 조회)MutableStateFlow에 값을 변경하는 방법StateFlow의 값에 접근하는 방법Sealed Class와 함께 사용하기StateInsavedStateHandle과 같이 사용하기 1. StateFlowStateFlow는 업데이트가 가능한 데이터 값을 가지는 State라는 것을 가지고,collector에게 emit(전파)하는 인터페이스인.. 2025. 1. 22.
Gravity와 Layout_Gravity 의 구분법 정리 XML로 UI를 그리면서,헷갈리는 속성2가지가 있는데요.바로 gravity와 layout_gravity입니다. 이 둘은 같은 텍스트가 포함되어 있어,뭐가 다른건지 차이를 알기 어려운데요.오늘은 이 두 속성의 차이를 구분해 보겠습니다. 1. GravityGravity는 뷰 내부 콘텐츠의 위치를 지정합니다.해당하는 뷰의 자식뷰들을 어디에 배치할지를 결정합니다. 아래는 TextView인데요.TextView내부의 Text들의 배치를 center로 결정하였습니다.  아래에서 사용된 gravity="center_vertical|start"는,버튼 내부에서,아이콘과 텍스트를,세로방향에서는 중앙(center_vertical)에 위치시키고가로로는 시작 부분(start, 왼쪽)에 배치합니다    2. Layout_.. 2025. 1. 21.
Coroutine Async와 await 사용시 Exception Handling 방법 정리#Kotlin Coroutine에서 비동기 코드에서의 반환 값이 필요할 때,코루틴 빌더인 async와 await()함수를 사용합니다. 하지만 이 API들은 Exception을 핸들링 할 때 주의가 필요한데요.오늘은 async와 await() 사용시,Exception을 핸들링 하는 방법에 대해 알아보겠습니다. 1. async 예외 전파 이해하기코루틴 빌더인 async와 await함수를 사용시,Exception핸들링을 하려면,코루틴의 예외 전파방식에 대해 이해해야 하는데요. 먼저 보아야 할 것이,코루틴 빌더인 async의 리턴타입입니다.아래와 같이 Deferred타입인데요.이 타입은 아래 보이는 것처럼, Job을 상속받고 있습니다.  코루틴 빌더인 async는,Job을 통해 부모-자식 관계가 형성되구요.Exception.. 2025. 1. 13.
코루틴 Flow vs StateFlow vs SharedFlow vs LiveData 총정리 하기 Android와 Kotlin의 코루틴이 계속 발전하면서,리액티브(반응형) 프로그래밍을 구현한 다양한 API들이 많이 나왔습니다.특히 데이터 스트림을 다루는Flow, StateFlow, SharedFlow, LiveData는비슷해 보이지만 각각 다른 특징을 가지고 있는데요.오늘은 이 4가지 API를 철저히 비교해서 총정리해 보겠습니다. 1. Flow, StateFlow, SharedFlow, LiveData 표로 비교하기Flow, StateFlow, SharedFlow, LiveData의 특징들을 살펴보고,아래에서 표로 자세히 비교해 보겠습니다.Flow: 코루틴 기반의 거대한 API로 콜드(Cold) 스트림이며, Collect()될 때마다 새로운 스트림을 생성합니다.Backpressure도 지원하는 대표적.. 2024. 12. 30.
Android Intent 결합시 사용하는 OR 비트 연산자 안드로이드에서 Intent를 결합해 사용하는 경우가 종종 있습니다.이럴 때 OR 비트연산자를 사용하면, 코드가 간결해지는데요.오늘은 이렇게 Intent 결합 시에 사용하는 OR 비트 연산자에 대해 알아보겠습니다. 1. Intent에서 사용하는 OR 비트 연산자Intent를 결합할 때 사용한다고 하는 비트 연산자를,실제 코드를 보겠습니다.아래에서는 FLAG_ACTIVITY_CLEAR_TOP과 FLAG_ACTIVITY_NEW_TASK를 OR 비트 연산자로,같이 add해 주었습니다.아래의 'or'은 OR 비트 연산자를 의미합니다.여기서는 2개의 flag를 다 사용하겠다는 의미가 됩니다.  Intent(this@SplashActivity, destinationActivity) .addFlag.. 2024. 12. 21.
Android API key 값 안전하게 Local.properties 에 보관하기 API 키 값을 github에 직접 보관하는 일은 위험합니다.그래서 안드로이드앱을 개발하는 경우,Local.properties를 활용해서 안전하게 보관해야 하는데요.오늘은 이 방법에 대해서 정리하겠습니다. 1. local.propertieslocal.properties파일은 다음의 목적으로 존재합니다.안드로이드 SDK위치 저장: 개발자마다 다를 수 있기 때문에, local.properties에 저장해서 사용민감한 정보 보호: API키, 비밀번호등을 안전하게 저장개발자별로 다른 설정local.properties는 대부분 '.gitignore'파일에 포함되어 있지만,중요한 값을 넣기전에, 한번 더 확인해 보아야 합니다. Gradle빌드시에 이 파일의 정보를 사용할 수 있게 해주므로,안전하게 값을 사용할 수 .. 2024. 12. 18.
BuildConfig 와 ProductFlavors 정리 # BuildConfigField vs ResValue 오늘은 BuildConfig와 ProductFlavor에 대해 정리하겠습니다. BuildConfig는,빌드별로 다른 상수값을 사용하기 위한 클래스인데요.아래의 2가지 함수를 제공해 줍니다.BuildConfigFieldResValue ProductFlavors는,기본 기능은 같지만,약간 다른 타입의 앱번들(cbt, real 버전등)을 생성해 주는데요.그래서 릴리즈 할 때 유용하게 사용됩니다. 둘 다, 빌드설정과 관련하여 많이 사용하는 기능들인데요.먼저 BuildConfig부터 알아보겠습니다. 1. BuildConfig1-1. BuildConfigField와 resValueBuildConfig클래스의, BuildConfigField와 resValue는, 빌드별로 다른 값을 가지도록 할 때 사용합니다. 안드로.. 2024. 12. 18.
안드로이드 Cache 디렉토리 이용해 xml 화면 공유하기 오늘은 안드로이드 Cache 디렉토리를 이용해,xml로 구성된 화면을,이미지 파일로 생성해 공유하는 방법을 보겠습니다. 구체적인 구현방법을 알아보기 전에,이미지 공유를 위해서,안드로이드 저장공간 중,왜 Cache 디렉토리를 이용해야 하는지부터,알아보겠습니다. 1. 안드로이드 Cache를 사용하는 이유저장소에 대한 권한은 계속 바뀌어 왔습니다.프라이버시를 강화한 것이라고 하지만,안드로이드 버전별 코드 파편화가 심해지는 현상 때문에,구현하는 개발자 입장에서 테스트해야할 기기도 많아졌고,동적권한 관련해서 코드도 복잡해 졌습니다. 그래서 저는 항상 권한으로부터 자유로운 공간들을 사용할 수 없는지부터 판단합니다.이러한 공간에서 해결할 수 없는 저장공간에 대해서만,복잡하게 파편화된 코드를 사용하는 것 이지요. 이렇.. 2024. 12. 10.
안드로이드 Webp이용해 이미지 용량 줄이는 방법 앱의 용량을 줄이고 로딩속도를 늘이는데,코딩도 중요하지만 이미지 용량을 줄이는 것도 중요합니다.안드로이드 스튜디오를 이용하면,이미지 파일을 Webp로 전환하하여 용량을 크게 줄일 수 있는데요.오늘은 이 방법을 알아보겠습니다. 1. Webp 이미지 파일Webp는 Google에서 만든 이미지 파일형식입니다.안드로이드와 안드로이드 스튜디오에서도 사용이 가능한데요.사실 저희에게는 거창한 알고리즘 보다,png나 jpg보다 얼마나 사이즈를 줄일 수 있느냐가 중요한데요.약 70%까지도 줄일 수 있다고 합니다. 2. 손실 압축 방식과 무손실 압축 방식webp는 JPEG와 같은 손실압축방식과 PNG와 같은 무손실 압축방식을 모두 다 지원하는데요.API레벨 18이상에서는 PNG와 같은 무손실 압축과 투명배경 지원도 가능합.. 2024. 11. 15.
RxJava CompositeDisposable의 clear()와 dispose()의 차이점 CompositeDisposable은 여러 Disposable 객체를 한 곳에서 관리할 수 있는,RxJava의 유용한 클래스입니다.이 CompositeDisposable에 dispose()함수를 사용하면,구독을 해제하고 관련리소스를 해제해 줍니다.dispose는 '처분하다', '처리하다'의 뜻을 가지고 있기도 하지요.그런데, clear()라는 메소드도 있습니다. 메소드 이름만 보면 둘 다 비슷한 의미를 가지고 있는 것 같은데,어떻게 다른 걸까요?오늘 글에서 보겠습니다. 1. dispose()dispose()는,현재 CompositeDisposable에 추가된 모든 Disposable을 해제하고, CompositeDisposable 자체도 해제하는 강력한 메소드입니다. 여기서 말하는 Disposable은.. 2024. 11. 15.
안드로이드 Splash Screen API 적용하기 21년도 구글에서 새로운 Splash Screen에 대해서 발표하였습니다.이제는 이를 적용하지 않는 Android12이상의 기기에서는,이중으로 Splash화면이 보여지고 있는데요.오늘은 SplashScreen 를 적용하는 방법에 대해 알아보겠습니다. 1. 하위 호환성 위한 라이브러리 설치새로운 SplashScreen은 Android 12버전부터만 적용가능합니다.따라서 그 이하의 기기에서의 호환성을 위해서는 아래의 라이브러리가 필요합니다.build.gradle에 아래 한 줄을 추가해 줍니다. implementation 'androidx.core:core-splashscreen:1.0.1'   2. 이미지 준비먼저 새로운 Splash화면을 적용할 이미지가 준비되어야 합니다.기존에 Splash이미지를 가지고.. 2024. 11. 15.
Playstore 앱 제목 수정 요청 케이스 오랜만에 업데이트한 앱이 있었는데요.예전에는 무료 앱인 경우,유저들에게 어필하기 위해서 '무료'나 'Free'라는 단어를,제목에 넣었습니다. 그런데 오랜만에 앱을 업데이트해서 올렸더니,다음과 같이 수정하라고 메일이 날아왔습니다.    핵심은 며칠까지 수정해서 제출 안 하면,플레이스토어에서 앱을 삭제하겠다는 것입니다. 무거운 마음으로,Playstore에 접속해 보니,다행히 다음과 같이 가이드가 나와 있습니다.가격이나 프로모션을 나타내는 키워드를 사용하면 안 됩니다.이런 점은, 예전보다 구글이 많이 좋아진 것 같습니다.  바로 제목에 포함되어 있던 Free를 빼고,스토어 등록정보를 업데이트하였습니다. 날이 갈수록 구글스토어의 정책은 타이트해져 가고 있는데요.구글 플레이스토어에 앱 이름을 등록할 때,가.. 2024. 11. 8.
RxJava fromAction()과 andThen() 으로 구현하는 순차적 실행 코드 오늘은 RxJava의 연산자인 Completable.fromAction()과 andThen() 연산자를 이용해서,순차적으로 실행이 보장되는 코드를 구현하는 방법을 정리하였습니다. 1. Completable.fromAction()1-1. Completable.fromAction()Completable.fromAction() 메서드는,주어진 Action을 실행하고,그 결과를 Completable 형태로 반환합니다. 본격적으로 이해하기 전에 이 메소드의 특징을 간단히 알아보겠습니다.Completable이 구독될 때까지 실행되지 않음.각 구독마다 Action이 새로 실행됨기본적으로 구독이 발생한 스레드에서 실행됨 ("subscribe()"를 호출한 스레드에서 실행)하지만 subscribeOn()을 통해 실행 .. 2024. 11. 8.
RxJava first()와 single()의 차이 총정리 RxJava에서 Observable을 Single타입으로 변환할 수 있는 방법이 있는데요.바로 first()와 single()을 사용하는 것 입니다.오늘은 이 둘의 차이를 알아보고 적절하게 사용하는 방법에 대해 보겠습니다. 1. first()와 single의 차이RxJava의 Observable의 first()나 single()을 사용하면,하나의 아이템만을 구독할 수 있습니다. 이 둘을 표로 비교하면 다음과 같습니다.  first()single()사용스트림의 첫 번째 항목만 필요할 때 사용정확히 하나의 항목만 방출되는지 확인하고, 그 항목을 방출(여러개 방출시 에러)에러처리비어있으면 NoSuchElementException발생 시킴비어있거나 둘 이상의 항목을 포함하면 에러를 발생 시킴완료 시점첫 번째 항.. 2024. 11. 4.
RxJava concatMap 정리: flatMap과 비교하며 이해하기 비동기 병렬 처리는 성능 향상에 큰 도움이 되지만, 데이터의 처리 순서가 중요한 상황도 많습니다.예를 들어 데이터베이스 작업이나 파일 처리와 같이 순서가 중요한 작업에서는 순차적 처리가 필수적이지요.RxJava에서는 이러한 순차적 처리를 보장해주는 concatMap 연산자를 제공해 주는데요. 오늘은 이를 살펴보고,비동기 처리에 사용하는 flatMap과 비교하며 이해해 보겠습니다.1. concatMap 의 특징1-1. 순서보장과 순차적 실행concatMap은 실행순서에 있어서 다음과 같은 특징을 가지고 있습니다.원본 Observable의 항목 순서를 엄격히 유지원본 Observable에서 방출된 각 항목에 대해 생성된 Observable들을 순차적으로 실행이전 Observable이 완료된 후에만 다음 O.. 2024. 11. 3.
RxJava flatMapCompletable 과 flatMap + ignoreElement 조합의 차이 이해하기 오늘은 RxJava에서 Completable을 방출해주도록 변환해주는 연산자인,flatMapCompletable과 flatMap + ignoreElement 조합의 차이에 대해서 알아보겠습니다. 1. flatMapCompletableflatMapCompletable은,Single이나 Observable의 각 항목을 Completable로 변환합니다. 여기서 말하는 Completable은,onComplete 혹은 onError 이벤트만 발생시키는,Observable 을 말합니다. Completable을 방출한다는 것은,flatMap을 통해서 작업을 한 후,반환되는 데이터가 필요하지 않다는 뜻 입니다.이런 종류의 작업으로는 데이터베이스에 저장하는 경우를 생각해 볼 수 있겠네요. Observable.just(.. 2024. 11. 2.
Java 8의 메서드 참조(Method Reference) 문법 이해하기 오늘은 Java8의 메소드 참조 문법에 대해서 알아보겠습니다.이 문법은 RxJava에서도 사용가능한데,이를 사용하면 아주 간결한 표현이 가능해집니다. 1. 메소드 참조이미 이름이 있는 메서드를 람다 표현식으로 사용할 수 있게 해주는 문법입니다.메소드 참조 문법은 '클래스::메소드' 순서로 적어서 사용하는데요.예를 들어, String 클래스의 정적 메소드인 toUpperClass는 아래와 같이 사용할 수 있습니다. String::toUpperCase  그런데 잘 보면, 클래스와 메소드만 있고,인자로 사용되는 변수명 자체가 사라진 것을 볼 수 있습니다. 보통 람다식에서라면 아래와 같이 변수명이 하나 필요한데요.s -> s.toUpperCase() 메소드 참조를 이용하면,컴파일러가 컨텍스트를 통해,필요한 매개.. 2024. 11. 2.
RxJava ignoreElements() 연산자에 대한 이해 오늘은 RxJava의 연산자 중,ignoreElements()에 대해서 알아보겠습니다. 1. ignoreElements()연산자 이름만 보면 이해하기가 쉬운데요.Observable 에서 흘러나오는,데이터를 모두 무시하는 연산자입니다. 그런데, 그냥 무시할꺼면 왜 사용할까요?흘러나오는 데이터가 필요없기 때문입니다.단순히 완료 되었는지, 또는 오류가 발생했는지만, 알고 싶을 때 사용합니다. ignroeElements()를 사용해 주면, 원래의 Observable이 Completable로 변환되는데요.Completable은,onComplete 또는 onError 이벤트만 발생시키는,특별한 유형의 Observable입니다. Observable numbers = Observable.range(1, 5);numbe.. 2024. 10. 30.
안드로이드 스튜디오에서 넘치는 글 개행하기: soft wrap 안드로이드 앱을 제작할 때,json파일을 불러와 사용하는 경우도 생기는데요.긴 텍스트가 포함된 JSON 데이터를 안드로이드 스튜디오에서 확인할 때,개발자들은 끊임없이 가로 스크롤을 해야 합니다.이로 인해 가독성이 떨어지고 오타를 찾기가 매우 어려워지죠. 이를 개선하려면, 안드로이드 스튜디오자체에서 개행을 할 수 있도록 해 주어야 하는데요.이를 'soft wrap' 혹은 'word wrap'이라고 합니다.오늘은 이를 안드로이드 스튜디오에서 설정하는 방법을 정리하겠습니다. 1. 설정먼저 안드로이드 스튜디오의 'Preferences'를 찾습니다.단축키는 아래와 같습니다.Command + ,(콤마)  2. Editor 나오는 좌측 네비게이션에서,"Editor > General"로 들어갑니다.그럼 아래와 같이.. 2024. 10. 10.
ifEmpty 와 orEmpty 에 대해서 알아보자 # Kotlin 오늘은 Kotlin 의 ifEmpty 와 orEmpty 에 대해서 정리해 보도록 하겠습니다. 1. ifEmpty Kotlin에는 emptyList인 경우에 디폴트 값을 넘겨줄 수 있는 API가 있는데요. 바로 ifEmpty()입니다. 이 함수의 코드를 보면 아래와 같은데요. isEmpty()로 Collection이 비어있는지를 확인하고, 비어있다면 디폴트 값을 넘겨줍니다. 2023. 5. 30.
CoerceIn, coerceAtMost, coerceAtLeast 범위지정 함수에 대한 정리 # Kotlin 오늘은 Kotlin 에서 값의 범위를 강제할 수 있는, coerceIn, coerceAtMost 그리고 coerceAtLeast 에 대해서 정리해 보겠습니다. 1. CoerceIn 원래 Coerce 라는 단어는 강제로 무언가를 하게 한다는 의미인데요. CoerceIn 은 강제로 어느 범위로 넣게 하겠다는 것 입니다. 인자로 최소값과 최대값을 받는데요. 이 최소값보다 적게나오면, 최소값을, 최대값보다 크게나오면, 최대값을 리턴하도록 강제해주는 API 입니다. 예를 들어서 아래 코드와 같은 경우를 들 수 있습니다. 아래는 Percent 값을 구하는데, distance나 distanceBetween 이 마이너스가 나올 경우에도, 0과 1 사이에서만 값을 주도록 강제해 주었습니다. val distanceInPe.. 2023. 5. 26.
EOFException 발생시키는 empty body 대응 방법 # Retrofit Retrofit 을 이용해서 정상적으로 서버의 데이터를 요청하였을 때, 200 OK를 받았는데도, 서버에서 empty body를 주어서, EOFException 이 발생하는 경우가 있습니다. 오늘은 이것의 대응 방법에 대해서 정리해 보겠습니다. 1. 서버 200 과 EOFException 위에서 언급한 것처럼, 서버에서 200 OK 를 주었는데도, body가 비워져 있어서, EOFException 이 발생할 수 있습니다. 서버에서는 데이터 없으니 "" 를 보내버린 것이구요. 아래와 같이 body는 0-byte가 되어 있습니다. 2023. 5. 25.
MapNotNull 과 MapNotNullTo 에 대한 정리 # null 제거 오늘은 MapNotNull 과 MapNotNullTo 에 대해서 정리해 보도록 하겠습니다. 1. MapNotNull mapNotNull은 엘리먼트에 주어진 transform 연산자를 적용하여서, null 이 나오지 않는 값들로만 list 를 구성해서, 반환해주는 함수입니다. 이름에 map이 있지만, 반환하는 타입은 아래와 같이 List 입니다. null 을 제거해주는 방어연산자라고도 할수 있겠습니다. 2. MapNotNull 예제1 코드를 보면서 이해해 보겠습니다. mapNotNull연산자 안에서, 2로 나누어 나머지가 없이 딱 떨어지는 값은 2를 곱해주고, 그렇지 않은 경우는 null을 리턴하는 조건문을 넣어주었습니다. val numbers = listOf(1, 2, 3, 4, 5, 6) val dou.. 2023. 5. 24.
Broadcast Receiver 등록하고 시스템 이벤트 받아서 처리하기 안드로이드의 시스템은 이벤트가 발생할 때 broadcast를 보내줍니다. 이름이 broadcast이니, 방송을 한다고 해야할까요. 안드로이드 내부적으로 이벤트가 발생을 했다고 알려주는 것인데요, 안드로이드 앱에서, 시스템에게 특정한 이벤트에 관해 관심이 있다고 등록을 하면, broadcast를 수신할 수 있게 되는데요. 오늘은 사용자가 이어폰을 스마트폰에서 빼거나 꽂았을 때, 시스템 이벤트를 받아서 토스트 팝업을 띄우는 방법에 대해서 정리해보겠습니다. 네이버 뮤직 같은 앱들이 헤드폰을 빼거나 꽂았을 때, 플레이를 멈추도록 하는 기능도 broadcastReceiver를 이용했을 거라고 생각이 됩니다. 1. BroadCast 받는 방법 안드로이드의 시스템으로부터는 여러가지 broadcast를 받아서 볼 수 .. 2023. 5. 23.