전체 글140 1장 코틀린 코루틴 이해하기 - 중단은 어떻게 작동할까? 시퀀스 빌더 시퀀스 빌더는 시퀀스를 만드는 도구이다. 시퀀스 빌더를 사용하면, 단계별로 데이터를 추가하면서 시퀀스를 구성할 수 있다. 예를 들어, yield 함수를 사용하면 하나의 요소를 시퀀스에 추가할 수 있고, yieldAll 함수를 사용하면 여러 요소를 한번에 추가할 수 있다. 간단히 말하면, 시퀀스 빌더는 단계별로 데이터를 추가하면서 '지연 계산'이 가능한 시퀀스를 만드는 도구이다. 시퀀스란 시퀀스는 코틀린에서 지원하는 특별한 종류의 컬렉션이다. 시퀀스의 주요 특징은 '지연 계산'이다. 즉, 시퀀스의 각 요소는 필요할 때까지 계산이 미루어지며, 이는 큰 데이터 셋을 다룰 때 메모리 사용량을 줄여준다. ※ 컬렉션(Collection) : 여러 개의 데이터를 그룹으로 관리할 수 있는 데이터 구조 특징.. 2024. 1. 9. 1장 코틀린 코루틴 이해하기 - 코틀린 코루틴을 배워야 하는 이유 코틀린 코루틴을 배워야 하는 이유 예시를 들어보자. 아래 예시는 AP로부터 뉴스를 가지고 와서 정렬한 다음, 스크린에 띄우는 로직을 구현하는 경우다. fun onCreate() { val news = getNewsFromApi() val sortedNews = news .sortedByDescending{ it.publishedAt } view.showNews(sortedNews) } 위의 예제는 안타깝게도 위와 같은 방식으로 개발할 수 없다. 이유는 안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 단 하나만 존재하기 때문에 Main쓰레드는 블로킹되서는 안된다. 때문에 getNewsFromApi() 함수가 쓰레드를 블로킹 할 것이고, ANR 이 생길 것 이다. 위의 문제를 해결하기 위해 아래와 같이 .. 2024. 1. 8. 안드로이드에서의 직렬화에 대해 알아보자 (Serializable, Parcelable) Info 나는 사이드 프로젝트 중 Clean Architecture로 레이어를 나눠 개발 중이였다. 현 상황은 UI레이어에서는 Domain의 Book이란 객체를 사용하고 있었다. JetPack Navigation을 이용해 이전화면에서 데이터를 넘김과 동시에 화면을 이동하려 하는데 Serializable 이나 Parcelabe이 아니면 객체를 넘기지 못했다. 이런 상황에서 Domain은 순수한 객체여야 하기에 Parcelabe 는 Android SDK 인터페이스이기에 사용하지 못한다. 그렇기에 이 상황을 넘김과 동시에 직렬화에 대해 좀더 이해하기 위해 이 글을 작성한다. 직렬화란? 직렬화는 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 byte 코드 형태로 나열하는 것이다. 여기서 메모리 .. 2023. 12. 2. Retrofit 과 Coroutine 간의 Viewmodel에선 Dispacher.IO로 전환해야 할까? 요즘 코루틴을 공부하며 서버 통신 및 내부 저장은 Dispacher.IO안에서 실행 한 후 Main으로 넘겨줘 ui에 반영해준다는 말을 지겹게 들었다. 이유는 Dispacher.IO는 필요에 따라 추가적으로 스레드를 더 생성하거나 줄일 수 있으며 최대 64개까지 생성이 가능하기 때문이라고 한다. 또한 Main을 점유하고 있으면 UI에서 작업하기에 ANR이 발생 할 수 있다고 한다. 그래서 구글에 나온 예시 코드를 보면 ViewModel.scope 안에 Dispacher.IO를 감싼 형태거나 먼저 Dispacher.IO 에서 코루틴 스코프를 설정하여 데이터를 가져온 후 내부에서 Dispacher.Main 으로 감싼 형태를 볼 수 있다. 이후 UseCase - Reopository - DataSorce - .. 2023. 11. 30. Jetpack Media3 나오게 된 배경 Media3는 기존에 존재하던 라이브러리(ex. Jetpack Media, Media2,Exoplayer 등등)에서 UI 재생, 그리고 Media Session 과 같은 공통 기능을 정의했으며 파편화 되었던 각 라이브러리들간의 복잡성을 추상화 하였다. 또한 공통으로 사용할 수 있는 Player인터페이스를 정의하여 편의성을 증대 시켰다. 이번 글은 Media3에 대해 알아보도록 하자. ☆중요 Media3이 이전 미디어 API와 구별되는 주요 특징 중 하나는 더 이상 구성요소 간 커넥터가 필요하지 않다는 것이다. 새로운 MediaSession클래스는 UI와 마찬가지로 Player 인터페이스를 구현하는 모든 클래스를 사용한다. ExoPlayer와 MediaController는 모두 이 인터페이.. 2023. 11. 15. [DroidKnights 2023] 김준비 - Coroutine Deep Dive - Android 실전편 이번 글은 DroidKnights 2023에 나온 김준비님의 Coroutine Deep Dive의 내용을 정리한 글입니다. What is Coroutine? Routine : 컴퓨터 프로그램의 일부로써 특정한 일을 실행하기 위한 일련의 명령 SubRoutine? 프로그램 가운데 하나 이상의 장소에서 필요할 때마다 되풀이 해서 사용할 수 있는 부분적 프로그램이며 실행 후에는 메인 루틴이 호출한 장소로 되돌아간다. fun a() { b() c() } Coroutine 이란? 일시 중단(suspend)과 재개(resume)가 가능한 루틴이며 특정 Thread에 결합되지 않으며, 하나의 Thread에서 중단하고 다른 Thread에서 재개 가능한 부분적 프로그래밍이다. How does suspension.. 2023. 11. 14. 미디어 용어 사전3 - Exoplayer BandwidthMeter(대역폭 측정기) 인터넷이란 큰 파이프 같은 거라고 생각했을때 이 파이프의 크기가 바로 우리의 "대역폭"이다. 그래서 이 파이프를 통해서 얼마나 많은 데이터가 흐를 수 있는지 알면 좋다. 이때, "대역폭 미터"는 이 파이프에서 얼마나 데이터가 흐르고 있는지를 알려주는 도구이다. 이 도구가 데이터의 양을 모니터링해서 알려준다. 그럼 예를 들어, 온라인에서 동영상을 본다고 상상했을때 동영상은 화질에 따라 다르게 나온다. 화질이 좋을수록 더 많은 데이터가 필요한데 대역폭 미터는 우리의 인터넷 파이프가 얼마나 큰지를 알려주고, 그에 맞게 동영상의 화질을 선택할 수 있게 해준다. 빠른 인터넷이면 화질을 높게 선택하고, 느린 인터넷이면 화질을 낮춰서 끊김 없이 동영상을 즐길 수 있다. 그래.. 2023. 11. 14. 미디어 용어 사전2 - Android AudioTrack AudioTrack은 안드로이드에서 제공하는 API로, 간단하게 말해 안드로이드 앱에서 소리를 재생하는 데 사용되는 도구이다. 이 API를 통해 음악, 효과음, 또는 다양한 오디오 소스를 앱에서 제어하고 재생할 수 있다. 예를 들어, 게임 앱에서 특정 상황에 맞는 효과음을 재생하거나 음악 앱에서 노래를 재생하는 데에 사용될 수 있다. AudioTrack은 오디오 데이터를 다루고 재생하는 데 도움이 되며, 앱 개발자들은 이를 활용하여 사용자에게 더 풍부하고 흥미로운 오디오 경험을 제공할 수 있다. AudioTrack 클래스는 Java 어플리케이션에서 하나의 오디오 자원을 관리하고 재생하는 역할을 한다. 이 클래스는 PCM(펄스 코드 변조) 오디오 버퍼를 오디오 장치로 전송하여 재생하는 .. 2023. 11. 14. 미디어 용어 사전1 - Basic 인코딩(코딩) / 디코딩 인코딩은 정보를 특정 형식으로 변환하는 과정을 의미한다. 이는 데이터를 효율적으로 저장하거나 전송하기 위해 주로 사용된다. 예를 들어, 비디오 인코딩은 큰 용량의 원본 비디오 데이터를 작은 크기로 압축하는 과정을 말한다. 반면, 디코딩은 인코딩된 데이터를 원래의 형태로 복구하는 과정이다. 디코딩을 통해 우리는 인코딩된 비디오 파일을 원래의 화질로 볼 수 있게 된다. 간단히 말해, 인코딩은 정보를 효율적으로 다루기 위해 변환하는 과정이고, 디코딩은 변환된 정보를 원래대로 복구하는 과정입니다. 코덱 '코덱'은 '코더'와 '디코더'의 합성어로, 미디어 파일을 압축(인코딩)하거나 압축을 풀어 원래의 상태로 되돌리는(디코딩) 기술을 의미한다. 코덱은 미디어 데이터를 효율적으로 다루기 위한.. 2023. 11. 12. [DroidKnights 2023] 빈혈(anemic) 도메인 모델과 쓸모없는 유스케이스 그리고 비대한(Bloated) 뷰모델에 대해 생각해보기 이번 글은 DroidKnights 2023 박종혁 님의 빈혈(anemic) 도메인 모델과 쓸모없는 유스케이스 그리고 비대한(Bloated) 뷰모델에 대해 생각해보기 에 대해서 정리와 나의 생각을 작성해보는 글이다. 이렇게 생긴 코드, 보신 적 있으신가요? 우리는 구글 아키텍쳐 UI Layer -> Domain Layer -> Data Layer 로 구성되어 왔다. 그런데 우리는 관습처럼 작성하는 아키텍쳐가 과연 객체지행에 대해서 잘 따르고 있는지 의문이다. 아래 예시를 보자. // Domain Model data class Developer(name: String, age: Int) data class DeveloperList(val list: List) // Repository interface Dev.. 2023. 11. 7. ExoPlayer / Player Player란? 'Player' 클래스는 미디어 재생을 관리하고 제어하는 데 핵심적인 역할을 한다. 핵심적인 역할은 다음과 같다. 미디어 제어 : Player는 미디어 재생을 위한 리모컨과 같다. 이를 사용하여 오디오 또는 비디오 콘텐츠의 재생을 시작, 일시 중지, 재개 및 중지한다. Track 관리 : 오디오, 비디오, 텍스트(자막) 등 다양한 트랙을 관리한다. 'Player'를 사용하면 활성화된 트랙을 제어하고 해당 설정을 조정할 수 있다. 미디어 세션 통합 : Jetpack Media3의 Player는 Android 미디어 세션 API와 통합된다. 이는 시스템 미디어 컨트롤과 원활하게 작동하여 사용자가 알림 컨트롤, 잠금 화면 및 기타 외부 인터페이스에서 재생을 제어할 수 있음을 의미한다. 이벤.. 2023. 11. 6. MPEG-DASH 란 들어가기 전 Adaptive Streaming 은 적응형 스트리밍으로 사용자의 네트워크 상태에 적응해서 스트리밍을 해주는 기술이다. 동영상 콘텐츠를 다양한 해상도로 인코딩해서 저장하고 이를 잘게 잘게쪼개어 저장을 해놨다가 사용자의 네트워크 상황에 따라서 최적의 동영상 콘텐츠 조각을 가져와 스트리밍 해주는 방식입니다. 대표적으로 Youtube가 이러한 방식이다. 통신 상황에 따라서 자동으로 해상도가 좋아졌다 나빠졌다하는걸경험해보셨을 것이다. 이를 이용하면 서비스를 제공하는 서버의 트래픽을 관리할 수 있을 뿐 아니라 사용자는 끊기지 않고 동영상 시청이 가능하게 된다. MPEG-DASH 란 MPEG-DASH는 국제 표준화된 최초의 적응 비트레이트 HTTP 기반 스트리밍 솔루션이다. 이전에는 동영상을 통째로 받.. 2023. 11. 3. DroidKnights - Jetpack Media3로 좋은 콘텐츠 소비 경험 구현하기 이번 글은 DroidKnights에서 발표한 류기민님의 Jetpack Media3로 좋은 콘텐츠 소비 경험 구현하기를 정리한 글입니다. 이전에는.... 2000년 중 후반쯤, 우리가 동영상을 볼 때 위와 같은 버퍼링표시를 보곤 했었다. 이때는 스트리밍이 고려되지 않은 상태여서 파일을 통째로 전달받아 재생하는 형태였다. 이때는 1%도 되지 않으면 재생이 되지 않았었다... 그랬던 시절을 지나... 2010년에 들어서 모다일 시장이 열려 스트리밍 시장이 확대되었다. 그래서 스트리밍을 위한 국제 표준 기술이 등장하게되는데...!! DASH Dynamic Adaptive Streaming over HTTP ISO 표준으로 개발된 HTTP Adaptive Streaming 의 한종류이다. Adaptive에서 알 .. 2023. 11. 2. Image Loader info 이번 목차에서는 Image Loader에 대해서 정리하는 글을 적으려 한다. 나는 다양한 SNS앱들의 빠른 이미지 로딩을 보며 어떻게 구현했길래 이미지를 로딩하는 화면을 안정적으로 동작시키는지가 궁금해졌다. 사실 나는 안드로이드 개발을 하면서 Glide, Piccaso, Coil 등등 Third Party 라이브러리만 사용만 해봤지 어떤 프로세스를 가지고 있는지, 이들의 차이점들에 대해서는 깊게 공부하지 않았기에 이번 글에서 정리해볼 예정이다. 이미지 로딩 라이브러리는 무엇인가? https://d2.naver.com/helloworld/429368 위의 블로그를 읽으면 이해가 된다. 그니까 이렇게 엄청나고 귀찮은 단계를 거쳐야하는 것을 처리해준다는 것이다. 위의 블로그에 작성된 엄청나고 귀찮은 .. 2023. 10. 22. CustomBottomSheet CustomBottomSheet 2023. 10. 14. 이전 1 2 3 4 5 6 ··· 10 다음