Android 34

LiveData 맛보기

LiveData는 관찰자 패턴을 사용하여 데이터 변경을 다른 컴포넌트에 알릴 수 있는 데이터 홀더다. ViewModel 및 데이터 바인딩과 함께 사용하는 것이 일반적이다. 👍 LiveData의 장점 수명주기를 인식한다. LiveData는 자신을 관찰하는 컴포넌트의 수명주기를 인식한다. 해당 컴포넌트의 수명주기가 활성 상태(STARTED 또는 RESUMED)이면 데이터 업데이트를 알린다. 반대로 비활성 상태이면 업데이트를 수신하지 않고 활성 상태로 전환됐을 때 수신한다. 메모리 누수가 없다. LiveData가 업데이트될 때 실행되는 콜백은 연결된 수명주기가 끝날 때 자동으로 삭제된다. 📦 LiveData 사용해보기 LiveData 객체 생성하기 LiveData는 추상 클래스이므로 서브클래스인 Mutable..

Android 2023.02.28

ViewModel 맛보기

ViewModel 클래스는 UI 관련 데이터 및 비즈니스 로직을 포함하는 아키텍처 컴포넌트다. 👍 ViewModel의 이점 앱을 사용하다가 화면 회전 같은 구성 변경이 발생하면 UI 컨트롤러(액티비티 및 프래그먼트)가 소멸한 뒤 바로 재생성된다. 이 과정에서 UI에 표시되어 있던 데이터가 손실될 수 있으므로 이를 보존하는 작업이 필요하다. 액티비티의 onSaveInstanceState, onRestoreInstanceState 콜백 메서드에서 Bundle을 사용하여 데이터를 백업 및 복원할 수 있지만, 이 방법은 추가적인 코드가 필요하며 적은 용량의 데이터만 보관할 수 있다는 단점이 있다. ViewModel은 구성 변경이 발생해도 소멸하지 않으며 추가적인 코드 없이 백업 및 복원이 용이하므로 UI 데이터..

Android 2023.02.27

Retrofit2로 JSON 데이터 요청하기

🔍 Retrofit이란? Retrofit은 개발자가 정의한 API를 사용하여 HTTP 통신을 할 수 있게 해주는 HTTP 클라이언트 라이브러리다. HTTP 요청을 통해 XML, JSON 등의 데이터를 받아올 수 있으며 이 포스트에서는 JSON을 다룬다. Retrofit A type-safe HTTP client for Android and Java square.github.io 🧩 라이브러리 설치하기 모듈 레벨 build.gradle 파일의 dependencies 블럭에 다음 종속 항목들을 추가한다. Retrofit2 HTTP 통신 작업을 수행한다. 컨버터 요청한 JSON 데이터를 변환한다. 여러 가지 컨버터가 있으며 여기에서는 GsonConverter를 사용한다. 아래 코드에서는 포스팅 시점 기준 최신..

Android 2023.02.21

WorkManager (4) : 작업 체이닝

작업 체이닝 WorkContinuation 객체를 사용하면 일련의 일회성 작업을 체이닝하여 예약할 수 있다. WorkManager#beginWith(OneTimeWorkRequest)는 처음 실행하고자 하는 작업 정보를 포함하는 WorkContinuation 객체를 반환한다. 그 다음 WorkContinuation#then(OneTimeWorkRequest)를 사용하여 이어서 실행하고자 하는 작업을 체이닝하면 된다. 한 번에 여러 작업을 동시에 실행하려면 위의 각 메서드의 파라미터로 List를 전달한다. 마지막으로 WorkContinuation#enqueue()로 작업 체인을 WorkManager에 예약하면 된다. 다음은 work1, work2, work3를 동시에 실행한 다음 cache, upload를..

Android 2022.12.10

WorkManager (3) : 작업 관리하기

작업 예약하기 작업을 예약하려면 WorkRequest 객체를 WorkManager의 예약 큐에 추가해야 한다. WorkManager 객체는 WorkManager.getInstance(Context)를 호출하여 액세스한다. 그러고 나서 enqueue(WorkRequest)에 WorkRequest 객체를 전달한다. val myWork: WorkRequest = // ... OneTimeWorkRequest or PeriodicWorkRequest WorkManager.getInstance(requireContext()).enqueue(myWork) 고유 작업 예약하기 작업을 예약할 때 고유 이름을 설정하면 해당 이름을 가진 작업 인스턴스가 하나만 존재하게 된다. 이렇게 하면 같은 작업이 중복 예약되는 문제를..

Android 2022.12.05

WorkManager (2) : 작업 상태

WorkManager에 예약한 작업은 실행되는 동안 여러 상태를 거친다. 작업 상태는 WorkInfo.State 값을 사용하며 다음 값 중 하나에 해당된다. 상태 설명 ENQUEUED 예약됨 RUNNING 현재 실행 중 SUCCEEDED 작업 성공 FAILED 작업 실패 CANCELLED 작업 취소 BLOCKED 이전 작업이 완료되지 않아 차단됨 일회성 작업의 상태 변화 일회성 작업의 상태는 ENQUEUED에서 시작한다. 실행되면 RUNNING 상태로 이동하고 결과에 따라 SUCCEEDED 또는 FAILED 상태로 끝난다. 아무 시점에서나 작업을 취소할 수 있으며 취소하면 CANCELLED 상태로 끝난다. SUCCEEDED, FAILED, CANCELLED는 일회성 작업의 최종 상태로 이 중 하나에 해당..

Android 2022.12.02

WorkManager (1) : 작업 설정/예약하기

WorkManager는 지속적으로 작업을 실행하기 위해 사용하는 API다. 앱 및 시스템을 재시작해도 작업을 유지할 수 있으므로 JobScheduler를 대체할 수 있다. 일반적으로 백그라운드에서 실행하는 작업을 지속해야 하기 때문에 백그라운드 작업을 실행할 때 사용하기를 권장하는 API다. WorkManager가 관리하는 작업의 유형은 다음과 같다. 즉시 실행 장시간 실행 지연 가능 Worker로 작업 단위 정의하기 Worker 추상 클래스의 하위 클래스를 정의하여 작업 단위를 정의한다. 실행하고자 하는 작업의 로직은 doWork()를 재정의하여 구현한다. doWork()는 ListenableWorker.Result 인스턴스를 반환하는데 이는 작업의 성공 여부를 나타내며 다음 3가지 경우로 나뉜다. R..

Android 2022.12.02

DataStore

DataStore는 프로토콜 버퍼를 사용하여 키-값 쌍 및 커스텀 객체를 저장할 수 있는 데이터 저장 솔루션이다. 내부적으로 Coroutine 및 Flow를 사용하기 때문에 비동기 트랜잭션을 통해 데이터를 일관성 있게 저장할 수 있다. 공식 문서에서는 DataStore를 규모가 작고 단순한 데이터셋에만 사용하고 반대의 경우에는 Room 라이브러리를 사용하도록 권장하고 있다. DataStore는 두 가지 방식으로 구현할 수 있다. Preferences DataStore SharedPreferences와 유사하게 키-값 쌍을 사용하여 데이터를 저장하는 방식이다. primitive 및 간단한 컬렉션 타입만 지원하기 때문에 타입 안전성을 보장하지 않는다. 객체 생성하기 androidx.datastore.pref..

Android 2022.11.30

Lifecycle

Lifecycle Lifecycle은 액티비티, 프래그먼트 같은 컴포넌트의 수명 주기 상태 정보를 포함한다. 이를 사용하면 컴포넌트의 수명 주기에 따르는 로직을 분리할 수 있으므로 컴포넌트의 코드가 간결해진다. 해당 상태 정보는 다른 객체에서 관찰할 수 있다. Lifecycle은 다음 두 enum을 사용하여 자신과 관련된 컴포넌트의 수명 주기 상태를 추적한다. State Lifecycle이 추적하는 수명 주기 상태. 이 enum은 다음 값을 포함한다. INITIALIZED CREATED STARTED RESUMED DESTROYED Event 프레임워크 및 Lifecycle에서 제공하는 수명 주기 이벤트. 이는 액티비티나 프래그먼트의 콜백 이벤트에 맵핑된다. 이 enum은 다음 값을 포함한다. ON_AN..

Android 2022.11.11

데이터 바인딩 (4) : 양방향 바인딩

단방향 데이터 바인딩은 데이터 변경 사항이 모델에서 레이아웃으로 전달되는 구조다. 반면에 양방향 바인딩을 사용하면 레이아웃에서 데이터 변경 사항이 역방향으로도 전달되게 할 수 있다. 단방향 바인딩에서 바인딩 표현식은 "@{}" 구문을 사용하지만 양방향 바인딩에서는 "@={}" 구문을 사용한다. 데이터 변경에 반응하도록 레이아웃 변수는 Observable 인터페이스를 구현해야 한다. 일반적으로 데이터 바인딩 라이브러리에서 제공하는 BaseObservable 클래스를 상속받는다. 그리고 게터에 @Bindable 어노테이션을 추가한다. 커스텀 속성으로 양방향 바인딩 커스텀 속성에 대해 양방향 데이터 바인딩을 사용하려면 다음을 따른다. MyView라는 커스텀 뷰의 time 속성에 양방향 바인딩을 사용하고자 한다..

Android 2022.11.05

데이터 바인딩 (3) : 바인딩 어댑터

바인딩 어댑터 바인딩 어댑터는 적절한 프레임워크를 호출하여 값을 설정하는 역할을 수행한다. 이를 사용하면 메서드를 호출하여 값을 변경하고, 바인딩 로직을 제공하고, 반환 객체의 타입을 지정할 수 있다. 속성 값 설정하기 바인딩 클래스는 바인딩된 데이터가 변경되면 표현식을 사용하여 뷰에서 세터를 호출해야 한다. 데이터 바인딩 라이브러리는 메서드를 자동으로 결정하거나, 메서드를 명시적으로 선언하거나, 메서드를 선택하는 커스텀 로직을 제공할 수 있다. 자동으로 메서드 결정하기 데이터 바인딩 라이브러리는 레이아웃 속성의 이름(네임스페이스는 고려하지 않음)에 해당하는 세터 메서드를 자동으로 검색한다. 예를 들어 android:text="@{user.name}"이라는 표현식을 사용한다면 user.getName()이..

Android 2022.11.03

데이터 바인딩 (2) : 이벤트 처리 / Observable

이벤트 처리 데이터 바인딩을 사용하면 뷰에서 전달되는 이벤트를 처리하는 표현식을 작성할 수 있다. 이벤트 속성의 이름은 몇 가지 예외를 빼면 리스너 메서드의 이름을 따른다. 예를 들어 View.OnClickListener의 onClick()에 대한 속성의 이름은 android:onClick이다. 데이터 바인딩으로 이벤트를 처리할 때는 다음 두 가지 메커니즘을 사용한다. 메서드 참조 바인딩 표현식에서 이벤트 발생 시 호출될 리스너 메서드를 참조한다. :: 연산자를 사용하여 참조할 메서드 이름을 지정한다. 이 표현식은 컴파일 타임에 처리되므로 해당하는 메서드가 없거나 서명을 잘못 사용하는 경우 컴파일 에러가 발생한다. 예를 들어 버튼을 눌렀을 때 MyHandler 클래스의 onButtonClick()을 호출..

Android 2022.11.01