본문 바로가기

Language/RxJava

(17)
[RxJava] 8장. 테스팅과 Flowable - Flowable 클래스 Flowable 클래스 RxJava 2.x에 새로 도입된 클래스. 배압(backpressure) 이슈를 위해 별도 분리된 클래스. Observable 클래스의 성능을 향상시키기 위해서 도입된 클래스로, 기존의 Observable 클래스에서 배압 처리가 불필요한 경우, 초기 로딩에 약간의 오버헤드가 존재했는데 이것을 제거함. Flowable의 활용은 기본적으로 Observable과 동일하다. toObservable(), toFlowable() 함수를 사용하여 Observable과 Flowable을 서로 변환한다. Flowable.just("Hello flowable").subscribe(System.out::println); Flowable.fromCallable(() -> { Thread.sleep(10..
[RxJava] 7장. 디버깅과 예외 처리 3 - 흐름 제어 흐름 제어 Observable이 데이터를 발행하는 속도와 옵서버가 데이터를 받아서 처리하는 속도 사이의 차이가 발생할 때 사용하는 함수. 주로 데이터를 받아서 처리하는 속도가 발행되는 속도보다 느릴 경우에 발생한다. sample() 함수 특정 시간 동안 가장 최근에 발행된 데이터만 걸러준다. 즉, 아무리 많은 데이터가 들어와도 해당 시간 구간의 마지막 데이터만 발행하고 나머지는 무시한다. String[] data = {"1", "2", "3", "4", "5"}; // 시간 측정용 CommonUtils.exampleStart(); Observable source100 = Observable.fromArray(data) .take(4) .zipWith(Observable.interval(100L, Time..
[RxJava] 7장. 디버깅과 예외 처리 2 - 예외 처리 예외처리 RxJava에서는 try-catch 문을 사용해서 예외처리를 할 수 없다. onError 이벤트는 데이터 흐름이 바로 중단되므로, Out Of Memory 같은 중대한 에러가 발생했을 때만 활용. onErrorReturn() 함수 에러가 발생했을 때 내가 원하는 데이터로 대체하는 함수. onError 이벤트는 발생하지 않는다. String[] val = {"1", "2", "#"}; Observable source = Observable.fromArray(val) .map(data -> Integer.parseInt(data)) .onErrorReturn(e -> { if(e instanceof NumberFormatException) { e.printStackTrace(); } return -..
[RxJava] 7장. 디버깅과 예외 처리 1 - 디버깅(Debugging) 디버깅 RxJava 코드는 로그를 넣을 수 있는 공간이 없다. Observable로 시작하는 업스트림과 그것을 받아서 처리하는 다운스트림이 동일한 문장으로 이루어져 있기 때문. 따라서, doOnXXX() 계열 함수를 이용하여 부수 효과를 일으켜 디버깅을 수행한다. doOnNext(), doOnComplete(), doOnError() 함수 이 3가지 함수는 Observable의 알림 이벤트에 해당한다. doOnNext는 Observable이 어떤 데이터를 발행할 때 발생. doOnComplete는 Observable이 모든 데이터를 발행할 때 발생. doOnError는 중간에 에러가 발생할 때 발생. Observable source = Observable.fromArray(exam); source.doO..
[RxJava] 6장. 안드로이드의 RxJava 활용 4 - 메모리 누수 메모리 누수 메모리 누수(Memory Leak)란 보통 참조가 완료되었지만 할당한 메모리를 해제하지 않았을 때 발생. 특히, 강한 참조의 경우 가비지 컬렉터가 메모리에서 객체를 제거할 수 없으므로 라이프 사이클에 맞게 객체 참조를 끊어주어야 메모리 해제가 가능하다. 메모리 누수는 시스템 전체 성능에 영향을 미친다. * Observable은 안드로이드의 컨텍스트(Context)를 복사하여 유지한다. onComplete(), onError() 함수가 호출되면 내부에서 자동으로 unsubscribe() 함수를 호출하여 메모리를 해제해준다. 하지만, 액티비티가 비정상적으로 종료되면 액티비티가 종료되어도 가비지 컬렉션의 대상이 되지 못하는 경우가 발생할 수 있으며, 이 때 메모리 누수가 발생하게 된다. 메모리 누..
[RxJava] 6장. 안드로이드의 RxJava 활용 3 - Thread 안드로이드는 기본적으로 싱글 스레드 모델. 따라서 처리하는 데 오래 걸리는 작업의 경우 별도 스레드로 분리하여 작업해야 한다. 뷰와 뷰 그룹의 스레드 관리 안드로이드의 뷰나 뷰 그룹은 UI 스레드(메인 스레드)에서만 업데이트할 수 있게 되어있다. 여러 스레드에서 동시에 UI를 업데이트할 때 발생할 수 있는 동기화 문제를 예방하기 위함. Looper와 Handler 클래스를 통해 일반 스레드에서 작업한 결과를 뷰에 업데이트 할 수 있다. * Looper와 Handler 클래스를 사용한 UI스레드 업데이트. Handler 객체가 스레드를 생성. 스레드는 Handler를 이용해 Message를 Messgae Queue에 넣음. UI스레드는 Looper 클래스를 이용해 Message Queue에 접근. Mess..
[RxJava] 6장. 안드로이드의 RxJava 활용 2 - RecyclerView 클래스 RecyclerView 클래스 리스트 뷰(ListView)의 장단점을 보완한 위젯. 한정된 수의 뷰를 유지해서 매우 효율적으로 스크롤 할 수 있는 큰 데이터 세트를 표시하기 위한 컨테이너. 서브 클래스인 LayoutManger를 이용하여 뷰를 정의, Adapter 클래스를 이용하여 DataSet에 맞는 ViewHolder 클래스를 구현할 수 있다. RecyclerView와 함께 사용하는 주요 클래스 Adapter : 데이터 세트의 아이템을 나타내는 뷰를 생성 ViewHolder : 재활용 뷰에 대한 모든 서브 뷰를 저장 LayoutManager : 뷰에 있는 아이템을 배치하고 관리 ItemDecoration : 아이템을 꾸미는 서브 뷰를 제어 ItemAnimation : 아이템을 추가, 정렬, 제거할 때..
[RxJava] 6장. 안드로이드의 RxJava 활용 1 - RxAndroid 소개 RxAndroid 소개 RxAndroid 기본 개념은 RxJava와 동일하다. Observable : 비즈니스 로직을 이용해 데이터를 발행 구독자 : Observable에서 발행한 데이터를 구독 스케줄러 : 스케줄러를 통해 Observable, 구독자가 어느 스레드에서 실행될지 결정. RxAndroid 장점 간단한 코드로 복잡한 병행 프로그래밍이 가능 비동기 구조에서 에러를 쉽게 다룸 함수형 프로그래밍 기법도 부분적 적용 가능 RxLifecycle 라이브러리 안드로이드와 UI 라이프 사이클을 대체한다기보다 구독할 때 발생할 수 있는 메모리 누수를 방지하기 위해 사용한다. 완료하지 못한 구독을 자동으로 해제한다. public class RxAndroidSample extends RxAppCompatActi..