본문 바로가기

Language/RxJava

[RxJava] 6장. 안드로이드의 RxJava 활용 1 - RxAndroid 소개

728x90

RxAndroid 소개

RxAndroid

기본 개념은 RxJava와 동일하다.

  • Observable : 비즈니스 로직을 이용해 데이터를 발행
  • 구독자 : Observable에서 발행한 데이터를 구독
  • 스케줄러 : 스케줄러를 통해 Observable, 구독자가 어느 스레드에서 실행될지 결정.

RxAndroid 장점

  • 간단한 코드로 복잡한 병행 프로그래밍이 가능
  • 비동기 구조에서 에러를 쉽게 다룸
  • 함수형 프로그래밍 기법도 부분적 적용 가능

RxLifecycle 라이브러리

안드로이드와 UI 라이프 사이클을 대체한다기보다 구독할 때 발생할 수 있는 메모리 누수를 방지하기 위해 사용한다.

완료하지 못한 구독을 자동으로 해제한다.

 

public class RxAndroidSample extends RxAppCompatActivity {

	...	
    
	private Unbinder mUnbinder;

	@Override
	void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mUnbinder = ButterKnife.bind(this);
        
		Observable.just("Sample").compose(bindToLifeCycle()).subscribe(Log::i);
	}


	@Override
	void onDestroy() {
		super.onDestroy();
		if (mUnbinder != null) {
			mUnbinder.unbind();
		}
	}
}

 

보통 사용하는 AppCompatActivity 클래스 대신 RxAppCompatActivity 클래스를 상속하도록 소스코드를 수정해야 한다.

또한, Observable 생성 부분에 compose()를 사용하여 라이프 사이클을 관리한다.

Observable은 RxAndroidSample 클래스가 종료되면 자동으로 해제(dispose)가 된다.

 

 

UI 이벤트 처리

View 클래스 안에는 UI 이벤트를 처리하기 위한 몇 가지 콜백 메서드가 존재.

이벤트 리스너

이벤트 리스너는 콜백 메서드 하나를 포함하는 뷰 클래스 안의 인터페이스.

onClick(), onLongClick(), onFocusChange(), onKey(), onTouch(), onCreateContextMenu() 가 존재한다.

 

* 액티비티 중복 실행 문제 해결 방법

빠른 시간 안에 액티비티의 실행을 다시 요청하면, singleTop의 경우에도 액티비티는 중복 실행 된다. 이 때, debounce() 함수를 사용하면 쉽게 문제를 해결할 수 있다.

 

...

@Override
public void onActivityCreate(Bundle savedInstanceState) {
	super.onActivityCreate(savedInstanceState);
    
	mDisposable = getObservable()
	.debounce(1000, TimeUnit.MILLISECONDS)
	.observeOn(AndroidSchedulers.mainThread())
	.subcribe(s -> ... );
    
    ...
}   

 

debounce 함수는 빠르게 연속 이벤트를 처리하는 흐름 제어 함수이다.

계산 스케줄러에서 동작하며, 어떤 이벤트가 입력되고 timeout에서 지정한 시간동안 추가 이벤트가 발생하지 않으면 마지막 이벤트를 최종적으로 발행한다.

즉, 지정한 시간동안 발생한 이벤트 중 마지막 이벤트를 발행하는 방식이다.

 

따라서, 액티비티를 빠르게 여러번 요청할 경우에도 지정한 시간동안 발생한 이벤트 중 마지막 이벤트만 발행하므로 중복 실행 문제를 해결할 수 있다.

 

*

안드로이드에서 UI 업데이트는 UI 스레드에서만 가능하다.

즉, .observeOn(AndroidSchedulers.mainThread()) 를 사용하여 구독자의 스레드가 메인(UI) 스레드임을 명시해준다.

이 부분을 생략하면 WrongThreadException 이 발생한다.

728x90