| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- Constraint Layout
- coroutine flow
- 더티비트
- android study jam
- Compose
- SOLID
- markdown
- 깃허브
- spring
- 리드미
- 마크다운
- LiveData
- Di
- 다단계 큐
- Spring Boot
- git
- JetPack
- O.S
- Data Binding
- 운영체제
- JUnit
- readme
- test
- Class.class
- design pattern
- 데드락
- OS
- kotlin
- github
- Android
- Today
- Total
목록Android (27)
차지
리플렉션 객체를 통해 클래스의 정보를 분석하는 기법입니다. Class.class Instances of the class Class represent classes and interfaces in a running Java application. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. ⇒ Class 클래스의 객체는 자바 프로그램에서 사용되는 클래스들과 인터페이스들을 나타낸다. 사용 가능한 클래스의 인스턴스가 없을 때 .class를 사용하곤 합니다. 인스턴스가 있다면 get..
MVVM 패턴을 적용하다보면 View와 ViewModel의 관심사 분리를 위해 노력하곤 합니다. 그 중 이벤트 처리와 데이터를 다루는 객체로 LiveData를 사용했습니다. 기존에 사용하던 LiveData에서 Coroutine Flow로 마이그레이션하며 개념을 정리하려 합니다. 짧은 사전 설명 xml에서 버튼을 클릭하면 Fragment에서는 원하는 화면으로 전환합니다. 해당 동작을 dataBinding을 사용해 아래처럼 구현했습니다. Fragment에선 viewModel의 flow를 구독합니다. flow 데이터의 값을 수신하면 원하는 화면으로 전환합니다. xml에서 viewModel의 emit 함수를 실행시킵니다. viewModel에선 flow 값을 발행시킵니다. LiveData -> Flow Domai..
inline inline 키워드는 함수 선언 키워드인 fun 앞에 붙습니다. inline 키워드는 함수 구현 자체를 코드에 넣어 오버헤드를 줄이는 키워드입니다. 코드 예시 고차함수 fun setOnClickListener(onClick: () -> Unit) { onClick() } fun main() { setOnClickListener(print("clicked")) } 해당 코드를 자바코드로 디컴파일하면 아래처럼 동작합니다. (가독성을 위해 코틀린 코드로 동작원리만 비슷하게 작성했습니다.) fun main() { setOnclickListner( fun invoke() { print("clicked") } ) } inline 키워드 사용 같은 코드를 inline으로 작성하면 아래와 같습니다. inl..
Single Live Event & Event wrapper Data를 다루는 LiveData객체를 활용해 이벤트 발생을 처리하는 방법. 간단한 구현 특정 이벤트가 발생할 때마다 실행시켜야 하는 함수가 있다면 다음과 같이 구현할 수 있습니다. class ExampleViewModel: ViewModel() { private var _event: MutableLiveData = MutableLiveData() val event: LiveData = _event fun callEvent() { _event.setValue(Unit) } } class ExampleActivity: Activity() { fun main() { button.ClickListener { viewModel.callEvent() }..
Data Binding 먼저 데이터 바인딩에 대해 간략히 이야기하자면, xml위에서 코딩하는 방식입니다. 선언적 형식으로 앱의 데이터 소스와 UI의 구성요소를 결합합니다. class ViewModel { var text = "123" } 위와 같은 두 코드가 있을 때, Activity나 Fragment에서 따로 코드를 작성하지 않아도, viewModel에 있는 text 123을 xml의 TextView에 띄울 수 있습니다. Two-way Data binding UI에서 데이터 소스를 조작, 데이터 소스를 UI에 반영하는 두 방식을 동시에 xml에서 특정 함수를 실행시키거나 특정 반환값을 사용하는 것은 단방향 데이터 바인딩에서도 할 수 있습니다. View의 변경사항을 ViewModel에 저장하고, 동시에 ..
DI는 Dependency Injection의 준말로, 의존성 주입을 뜻합니다. DI Android에서 데이터를 관리할 때 ViewModel을 사용하곤 합니다. Repository 패턴도 함께 사용할 때가 많은데, 각설하고 코드로 예시를 보이겠습니다. class ViewModel: ViewModel() { fun fetch() { repository.fetch() } } 위 코드에서 ViewModel의 fetch 함수는 repository라는 변수가 필요합니다. 이 코드를 실행시키려면 다양한 방법이 있습니다. 내부에서 객체 생성 private val repository = Repository() 외부에서 주입 class ViewModel(private val repository: Repository): ..
프레임의 3가지 단계 Composition → Layout → Drawing 1. Composition Composable이 생성되는 단계입니다. 생성이 되면 다음 단계를 수행합니다. 2. Layout measurement, placement 두 단계가 존재합니다. 재배치를 하더라도 재측정을 하지는 않습니다. 3. Drawing Canvas를 호출하거나 draw관련 메서드를 호출하면 실행합니다. State 읽기 최적화 Box { val listState = rememberLazyListState() Image( // Non-optimal implementation! Modifier.offset( with(LocalDensity.current) { // State read of firstVisibleIte..
Side effects 일반적인 수명주기에서 더 복잡한 작업을 수행할 때 Side Effects를 필요로 합니다. LaunchedEffect Composable 내에서 suspend 함수를 호출할 때 사용 매개변수 중 하나가 변경되면 재호출 ex) 스낵바 호출, 스크롤 등의 일반적인 동작 rememberCoroutineScope Composable 외부에서 코루틴 실행할 때 사용 ex) 다른 composable을 취소시키는 비동기 동작 rememberUpdatedState 값이 변경되더라도 recomposition되지 않는 효과에서 값 참조 @Composable fun LandingScreen(onTimeout: () -> Unit) { // This will always refer to the late..