728x90
전체 글

전체 글

    [Android] LiveData 변형하기 (Transformations)

    안드로이드 미니 프로젝트를 진행하며 겪은 삽질과 거기서 배운 내용을 정리해보고자 한다. 내가 겪은 문제점은 다음과 같다. 뷰에서 DatePicker로 날짜를 선택하면, 선택된 날짜에 해당하는 정보들을 RoomDatabase에서 찾아 리스트로 표시해준다. 날짜에 해당하는 정보들은 LiveData로 묶어서 Observer를 걸어주었고, 날짜가 선택되면 쿼리를 날려서 LiveData 안의 value 값을 업데이트해주면 되었다. 하지만 생각했던대로 흘러가지 않았고, LiveData 안의 value 값을 업데이트해주기 위해 이것저것 찾아본 결과 Transformations이란 것을 알게 되었다. Transformations란? Transformations는 단어 뜻 그 자체로 LiveData를 변형한다고 생각하면..

    [Android] Jetpack WorkManager란?

    WorkManager란? 앱이 종료되거나 기기가 다시 시작되더라도 실행이 예상되는 연기 가능한 비동기 작업을 쉽게 예약할 수 있는 라이브러리 Background task 구현, 스케쥴 등을 쉽게 처리할 수 있도록 만든 기능이다. WorkManager 기능 Job 스케쥴링 : Job을 스케쥴링 할 수 있다. Job의 상태 모니터링 : 실시간으로 처리되는지 상태를 알 수 있다. Constraint : 원하는 조건에 Job이 동작하도록 제약을 줄 수 있다. Chaining Task : 여러 Job을 우리가 정한 순서대로 실행되도록 할 수 있다. WorkManager 주요 클래스 1. Worker 백그라운드에서 수행될 태스크를 의미한다. 추상 클래스인 Worker를 상속한 클래스를 구현하고 동작할 태스크를 구현..

    [Android] Jetpack LiveData란?

    LiveData란? LiveData는 데이터를 저장하고 변화를 관찰 할 수 있는 객체이다. UI객체는 LiveData에 옵저버를 등록할 수 있으며 데이터가 변경될 때 UI를 변경할 수 있다. 예를 들어, 아래처럼 LiveData를 생성하고 옵저버를 등록할 수 있다. 데이터가 변경되면 옵저버에게 전달된다. val elapsedTime = LiveData elapsedTime.observe(this, Observer { time -> tv_timer.text = time.toString() }) LiveData는 LifecycleOwner의 상태가 STARTED와 RESUMED로 활성화 상태일 때만 옵저버에게 데이터 변화를 알려주고, DESTROYED로 변경되면 LiveData도 자동으로 소멸된다. Live..

    [Android] Jetpack ViewModel이란?

    ViewModel이란? JetPack의 ViewModel은 액티비티의 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다. 안드로이드의 액티비티 생명주기와 분리를 시켜, 액티비티가 재실행돼도 데이터가 소멸되지 않도록 한다. 또한 액티비티가 파괴되면 ViewModel의 자원도 자연히 소멸된다. ViewModel 배경 시스템에서 UI 컨트롤러를 제거하거나 다시 만들면 컨트롤러에 저장된 일시적인 모든 UI 관련 데이터가 손실된다. 데이터가 단순한 경우 Activity는 onSaveInstanceState() 메서드를 사용하여 onCreate()의 번들에서 데이터를 복원할 수 있다. 하지만 이 접근 방법은 사용자 목록이나 비트맵과 같은 대용량일 가능성이 높은 데이터가 아니라, 직렬화했다가 다..

    [Kotlin] 코틀린 문법 정리 - 04

    1. 제네릭 (Generic) fun toFunction(value: T): () -> T = { value } fun main(args: Array) { val func: () -> Int = toFunction(1170) println(func()) } 2. 여러 타입을 인수로 받기 fun toFunction(value1: T, value2: R): () -> T = { value1 } fun main(args: Array) { val func: () -> Int = toFunction(1170, "test") println(func()) } 3. 구체화된(Reified) 타입 매개변수 타입 매개변수는 is 연산자의 피연산자로 사용할 수 없다. fun check() { val number = 0 if..

    [Kotlin] 코틀린 문법 정리 - 03

    1. Inline 함수 Inline 함수는 함수 호출문을 함수의 몸체로 대체하기 때문에 성능을 조금이나마 개선할 수 있다. inline fun hello(){ println("hello") println("kotlin") } fun main(args: Array) { hello() hello() hello() } Inline 함수를 호출하면 컴파일 되는 순간 아래와 같은 코드로 대체된다. fun main(args: Array) { println("hello") println("kotlin") println("hello") println("kotlin") println("hello") println("kotlin") } 2. lateinit lateinit 키워드가 붙은 프로퍼티는 클래스 안에서 바로 초기..

    [Android] Navigation Drawer 안에서 ExpandableListView 사용하기

    ExpandableListView란? ExpandableListView는 ListView의 한 종류로써, ListView는 단순히 리스트를 뿌려주는 역할을 하고, ExpandableListView는 말 그대로 확장 기능을 제공한다. 단순히 ListView처럼 array.xml을 생성하여 리소스 아이디를 직접 적용할 순 없고, HashMap을 만들어서 적용해야 한다. 이번 실습에선 Navigation Drawer 안에서 ExpandableListView를 사용해 부모와 자식 관계를 나타내 줄 것이다. 최종 결과물로 아래 사진처럼 나오게 된다. 코드 MainActivity.kt MainActivity에서는 ExpandableListView의 어댑터를 설정해야 한다. 어댑터에는 부모와 자식 관계를 나타내는 L..

    [Android] 데이터 바인딩(Data Binding) 사용하기

    데이터 바인딩이란? 앱의 데이터 소스와 레이아웃의 구성요소를 결합할 수 있게 해주는 Android JetPack의 라이브러리 중 하나이다. 기존에 데이터를 레이아웃에 그리거나 클릭 리스너를 연결시켜야 할 때 findViewById 메소드를 사용해서 뷰를 선언한 뒤, 클릭 리스너 인터페이스를 구현해야 했다. 물론 코틀린으로 넘어오면서 findViewById 메소드를 사용하지 않고도 할 수 있었지만, 클릭 리스너를 구현한다거나 값이 변경됐을 때 일일이 뷰를 찾아서 세팅해주는 번거로움이 있었다. 데이터 바인딩을 사용해서 데이터와 레이아웃을 결합해주면 이러한 번거로움을 해결할 수 있고, 좀 더 간결한 코드로 MVVM 패턴을 구현할 수 있다. 데이터 바인딩 사용하기 1. build.gradle 설정 데이터 바인딩..

728x90