본문 바로가기

전체 글

(271)
[Android] 프래그먼트에서 gif 로딩 다이얼로그(Dialog Fragment) 띄우기 개요 안드로이드에서는 다이얼로그를 액티비티에서 띄우는 것과 프래그먼트에서 띄우는 것에 대해 차이가 난다. Dialog Fragment를 활용하면 어느 프래그먼트에서는 Fragment Manger를 통해 다이얼로그를 띄울 수 있다. Dialog Fragment도 결국 Fragment이기 때문이다. 이번 포스팅은 직전의 포스팅([Android] 액티비티에서 gif를 이용한 로딩 다이얼로그 띄우기 (tistory.com))과 연관이 있다. 종속성 추가, Base Application 생성 등의 과정은 생략한다. 1. 커스텀 다이얼로그 프래그먼트 구현 class ProgressDialogFragment :DialogFragment(){ override fun onCreateDialog(savedInstanceS..
[Android] 액티비티에서 gif를 이용한 로딩 다이얼로그 띄우기 개요 Android에서 네트워크를 통해 데이터를 얻어오는 동안의 대기 시간 동안 유저로 하여금 작업이 진행 중임을 알리기 위해 로딩 다이얼로그를 띄우는 방법을 소개하는 포스팅이다. 절차 0. gif를 재생할 Glide 종속성 추가 implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' 1. gif 파일을 리소스 디렉토리의 raw 디렉토리에 넣기 로딩을 표시할 gif 파일을 다운로드 받거나 직접 생성하여 raw 디렉토리에 저장한다. 리소스 디렉토리에 raw가 없다면 생성한다. 2. 다이얼로그 xml 작성 loading_dialog.xml 3. 코드 ..
[RxJava] Scheduler Scheduler RxJava는 Scheduler를 통해 멀티 스레드와 같은 비동기 작업을 돕는다. Schedulers 클래스에서 제공하는 정적 팩토리 메서드로 설정할 수 있다. 종류 IO 네트워킹, DB, 파일 시스템 등의 블로킹 이슈가 발생하는 곳에서 비동기적인 작업을 위해 사용한다. newThread 매번 배로운 스레드를 생성하여 작업한다. Computation 단순 반복적인 작업, 콜백 처리 그리고 다른 계산적인 작업에 사용된다. 블로킹 이슈가 존재하는 곳에서는 사용하지 않는다. Trampoline 현재 스레드에 무한한 크기의 큐를 생성하여 모든 작업을 순차적으로 처리하는 것을 보쟝한다. mainThread RxAndroid에서 제공하는 스케줄러로 안드로이드의 메인 스레드에서 작동한다. subsc..
[RxJava] Disposable Disposable 저번까지의 포스트에서 Observable 객체에서 발행할 아이템을 정의하고 subcribe()를 통해 스트림을 생성하고 아이템을 발행했다. 사실, subscribe()를 호출한 후에는 Disposable 객체가 반환된다. Observable source = Observable.just(1,2,3); Disposable disposable = source.subsribe(o -> System.out.println(source)); 유한개의 아이템을 발행하는 Observable의 경우 onComplete() 호출로 안전하게 종료된다. 하지만 아이템을 끝없이 발행하거나 오랫동안 실행되는 경우 제대로 종료되지 않는다면 메모리 릭(leak)이 발생할 수 있다. 따라서, 명시적인 폐기가 필요하다..
[RxJava] Cold Observable과 Hot Observable Cold Observable Cold Observable은 이전 포스팅에서 다룬 것과 같이 Observable에 subscribe를 요청하면 아이템을 발행하기 시작한다. 아이템은 처음부터 끝까지 발행되고, 임의로 종료시키지 않는 이상 여러 번의 요청에도 처음부터 끝까지 발행하는 것을 보장한다. 다음은 interval을 통해 1초마다 아이템을 발행하는 예시이다. Observable src = Observable.interval(1, TimeUnit.SECONDS); src.subscribe(value -> System.out.println("First: " + value)); Thread.sleep(3000); src.subscribe(value -> System.out.println("Second: " ..
[RxJava] Observable Observable RxJava에서는 Observable을 구독(subscribe)하는 Observer가 존재하고, Observable이 순차적으로 발행하는 데이터에 대해서 반응한다. Observable은 다음 3가지 이벤트를 통해 동작한다. onNext(): 하나의 소스 Observable에서 Observer까지 한 번에 하나씩 순차적으로 데이터를 발행 onComplete(): 데이터 발행이 끝났음을 Observer에게 알려 onNext()이 더 이상 발생하지 않음을 알림 onError(): 오류가 발생했음을 Observer에 알림. 위에서 데이터 발행 과정에서 null은 발행 불가능하다. 그리고, 위 세가지 이벤트는 Emitter 인터페이스에 선언된다. 핵심: 이벤트를 만들어내는(emit) 주최. 즉..
[RxJava] 반응형 프로그래밍 반응형 프로그래밍(Reactive Programming) 최근 안드로이드 개발자 모집 공고를 보면 우대사항으로 'RxJava 사용 경험'이 많이 존재한다. 리액티브 프로그래밍이랑 기존 명령형(절차형) 프로그래밍과는 달리 데이터와 같은 주변 환경의 변화를 캐치하여 동작하는 프로그래밍 방식이다. 반응형 프로그래밍의 예시 반응형 프로그래밍은 모든 데이터를 '스트림(Stream)'으로 처리하며, 하나의 데이터 흐름은 다른 데이터 흐름으로 변형되거나 여러 데이터 흐름이 하나의 흐름으로 변경될 수도 있다. public void rxFun(){ PublishSubject items = new PublishSubject.create(); items.onNext(10); items.onNext(15); items.onN..
[Kotlin] 스트림 함수(확장 함수) - 조합 및 합계, 기타 조합 및 합계 zip() 함수는 두 컬렉션 내의 자료를 조합하여 새로운 자료를 만들 때 사용한다. 두 컬렉션 간 자료의 개수는 달라도 문제 없으며, 다르다면 조합에 사용하는 컬렉션 중 더 적은 쪽을 따라간다. 기본적으로는 Pair의 형태로 자료를 조합하고, 원하는 경우 조합 규칙을 지정할 수 있다. val cityCodes = listOf("SEO", "TOK", "MTV", "NYC") val cityNames = listOf("Seoul", "Tokyo", "Mountain View") cityCode.zip(cityNames) .forEach{pair -> println("${pair.first}:${pair.second}") } //SEO:Seoul //TOK:Tokyo //MTV:Mountain..