[Android] 코루틴 Blocking와 Non-Blocking의 차이
2024. 9. 25. 03:52
[# 2]…My DevelopStory
오늘 면접을 보았는데 문득 blocking과 non-blocking의 차이점을 설명해보라는 질문을 받았다.대충 뭔지는 알고 있었지만 개똥같은 대답을 했기에 기록해본다. Blocking코루틴의 블로킹은 현재 실행 중인 스레드를 중단시키고 작업이 완료될 때까지 대기하는 방식즉, 블로킹이 호출이 발생하면 해당 스레드가 멈춰서 다른 작업을 수행하지 않고 작업이 완료될 때 까지 기다린다.다른 작업을 수행하지 않지만 여전히 시스템 리소스를 소비하여 스레드가 낭비될 수 있으며, 네트워크 요청을 UI 스레드에서 블로킹 방식으로 처리하면, 네트워크 응답을 받을 때 까지 앱이 멈춘 것 처럼 보일 수 있다. Non-Blocking작업을 대기하는 동안 스레드를 멈추지 않고, 다른 작업을 계속 수행할 수 있도록 하는 방식이다...
[Android] Android VIewModel이 필요한 이유 / 뷰모델이 쓰이는 이유
2024. 9. 23. 20:04
[# 2]…My DevelopStory
MVVM도 알고 ViewModel도 알지만 정확히 왜 쓰이게 되었는지 어떻게 탄생하게 되었는지는 알 수 없어 정리해 보았다. ViewModel의 역할ViewModel은 안드로이드 컴포넌트의 생명 주기와 UI 상태를 분리하여 보다 안정적이고, 메모리 누수가 없으며, 재사용 가능한 코드를 만들 수 있도록 해준다.ViewModel을 통해 생명 주기 문제를 해결하였고, 앱의 복잡성을 줄이면서 데이터 관리를 예전보다 쉽게 해준다 ViewModel의 UI 데이터의 생명 주기 관리ViewModel은 Activity나 Fragment의 생명 주기와 독립적으로 동작하며, 이러한 UI 컴포넌트가 회전, 파괴, 재생성되더라도 데이터를 유지하여, 데이터를 다시 불러오거나 작업을 다시 재시작 할 필요가 없다. ViewModel..
[Android Compose] Icon onClick Event
2024. 8. 29. 18:36
[# 2]…My DevelopStory
문제발생Icon( imageVector = Icons.Default.Clear, contentDescription = "", tint = Color.Black,)기존에 추가한 Icon을 클릭해야 할 일이 생겨버렸다.아무리 뒤져보아도 onClick 이벤트를 찾을 수 없어서 구글링을 해보았다. 해결IconButton( onClick = { //TODO }, modifier = Modifier.size(24.dp)) { Icon( imageVector = Icons.Default.Clear, contentDescription = "", tint = Color.Black, )}처음에는 Box를 씌워보았지만 Box에도 onClick은 없었..
[Android Compose] BasicTextField Decimal formattng ~ 천단위 쉼표 추가
2024. 8. 28. 18:45
[# 2]…My DevelopStory
1. 문제발생BasicTextField 을 사용하면서 가격이 들어오면 천단위로 쉼표가 들어가는 로직이 필요했다.네이티브에서는 간단하게 포맷팅을 하면 되었는데 구글링을 해보니 정말 어려워 보였다. 생소한 visualTransformation을 커스텀해야했다. 2. 해결사실 나는 숫자만 들어가고 inputType도 Number로 되어 있다.그래서 간단하게 해결이 가능했다.val decimalFormat = DecimalFormat("#,###")onValueChange = { newText -> val cleanedText = newText.replace("[^0-9]".toRegex(), "") text = if (cleanedText.isNotEmpty()) { "${decimal..
[Android Compose] BasicTextField을 이용한 커스텀 사투기
2024. 8. 27. 04:09
[# 2]…My DevelopStory
Compose에서는 EditText가 TextField로 되어 있고, 이를 커스텀 하기 위해서는 BasicTextField을 사용해야 한다는 것을 알았다. 1. 문제발생내가 원하는 TextField는 위 이미지와 같이 되어 있으며 양 끝에는 Icon Vector 이미지가 들어가게 하고 싶었다.네이티브라면 바로 해버렸을 이 디자인을 꽤 오랜시간 만지게 되었다.BasicTextField( modifier = Modifier.wrapContentWidth(), textStyle = TextStyle(textAlign = TextAlign.Start), value = priceTextValue, maxLines = 1, keyboardOptions = KeyboardOptions(ke..
[Android Compose] Scaffold Content padding parameter it is not use
2024. 8. 26. 19:08
[# 2]…My DevelopStory
Compose를 사용할 때 최상위에 Scaffold를 사용해야 한다고 한다.Scaffold를 통해 Appbar나 Title, BottomBar 등을 셋팅할 수 있는데, 이를 사용하지 않을 경우에도 Scaffold를 사용할 수 는 있다. 하지만 단순히 Scaffold만 추가해 놓았더니 문제가 발생했다. 문제발생나는 AppBar나 BottomBar 등등의 UI는 필요하지 않다. 단순히 공부용으로 만지고 있는데, Scaffold를 추가하니 계속 Content padding parameter it is not use 만 뜨고 어노테이션을 붙이면 해결이 된다고 한다. 아니 이게 무슨 일인가 Padding을 쓰라니.. Padding은 어디서 나온 것이며 심지어 나는 Padding도 필요하지 않는데 말이지 해결set..
[Android Compose] Compose Dagger Hilt 적용하기
2024. 8. 26. 18:23
[# 2]…My DevelopStory
1. Module-App gradle Settingimplementation (libs.hilt.android)kapt (libs.hilt.android.compiler)implementation(libs.androidx.hilt.navigation.compose)plugins { id ("com.google.dagger.hilt.android") id ("kotlin-kapt") kotlin("kapt")} 나는 아직 옛날인간이라 예전 Gradle 스타일이 익숙하지만 요즘에는 저렇게 버전을 명시해 주지 않는가 보다.그래서 버전이 어디 명시되어 있나 타고 가보면libs.versions.toml 이라는 곳에 정리가 되어 있는 것을 알 수 있었다. [versions]agp = "8.5.0"h..
[Android] Di 주입, Dagger 라이브러리 Hilt의 핵심개념
2024. 5. 8. 04:00
[# 2]…My DevelopStory
바야흐로 Di 주입을 하기 위해 구글에서는 Dagger 라이브러리가 탄생하였고,여기에서 많은 개발자들의 입에서는 육두문자가 나왔느니, 그래서 탄생한 것이 Hilt 이니라 Hilt의 탄생배경Hilt는 안드로이드 앱에서 의존성 주입(Dependency Injection)을 관리하기 위한 Jetpack 라이브러리 중 하나입니다. Dagger Hilt는 Dagger와 Jetpack의 기능을 결합하여 안드로이드 앱의 의존성 주입을 단순화하고 개선합니다.아마 여기서 가장 큰 이유는 Dagger의 학습곡선이 너무나도 높기 때문에 구글측에서도 사용하기 용이하고 단순하게 하기 위해 Hilt를 낸게 아닐까 싶습니다. 그렇다면 의존성 주입이란 무엇인가?의존성 주입(Dependency Injection)은 객체 지향 프로그래..
[Android] Flow에 대하여, Flow란 무엇인가
2024. 5. 8. 02:59
[# 2]…My DevelopStory
안드로이드의 대표적인 비동기 처리라고 하면 코루틴을 떠올릴텐데, 이러한 코루틴을 더 효율적으로 프로그래밍 하기 위해 나온 도구가 Flow 입니다.데이터 스트림을 효율적으로 처리하고 관리하기 위해 등장을 하였죠 Flow의 주요 특징- 비동기 데이터 처리 : 코루틴과 함께 사용하기에 물론 비동기로 동작 합니다.- 데이터 스트림 관리 : Flow는 데이터 스트림을 생성하고, 변환, 결합하는 등 다양한 작업을 수행할 수 있습니다. 이를 통해 복잡한 비동기 작업을 명확하고 간결하게 코드를 작성할 수 있습니다.- 백프레셔 처리 : 백프레셔는 데이터 생산 속도가 데이터 소비 속도보다 빠른 경우 발생하는 문제입니다. Flow는 백프레셔를 처리하여 데이터 손실 없이 데이터 스트림을 안전하게 처리할 수 있도록 도와줍니다...
[Android] Keyboard show/hide detect Listener Utile
2023. 6. 2. 23:20
[# 2]…My DevelopStory
구글에서 자체적으로 안드로이드 기기의 키보드 노출/비노출 이벤트에 대한 리스너를 제공해주지 않는다. 그래서 따로 화면의 사이즈를 구해서 키보드가 올라왔는지 안올라 왔는지 구해야 하는데 공통 Utlle 클래스를 하나 만들어 두면 편하다 class KeyboardVisibilityUtils( private val window: Window, private val onShowKeyboard: ((keyboardHeight: Int) -> Unit)? = null, private val onHideKeyboard: (() -> Unit)? = null ) { private val MIN_KEYBOARD_HEIGHT_PX = 150 private val windowVisibleDisplayFrame = Rect(..