: Rxjava는 안드로이드에서 비동기 작업을 손쉽게 구현할 수 있게 해준다. 안드로이드는 UI 변경을 메인 스레드에서 밖에 못 한다. 따라서 메인 스레드에서의 작업을 최소화해 UI 끊킴 현상을 없애야 한다. 그러기 위해서 별도의 스레드를 만들어서 비동기 작업을 해야 한다. 이를 위해 흔히 AsyncTask, Handler, Service 등의 클래스를 사용한다. 만약 웹 서버와의 통신 후 결과를 UI에 반영한다면 별도의 AsyncTask를 구현한 후 doInBackground나 onPostExecute 등의 콜백 메서드에 작업 내용을 기술해야 한다. 하지만 Rxjava를 사용하면 별도의 클래스 구현없이 간단하게 구현할 수 있다. Retrofit라는 라이브러리까지 사용하면 코드 몇 줄로 구현 가능하다. 


다음은 Rxjava의 특징이다. Rxjava를 다 배우게 되면 아래 특징들에 대해 이해가 갈 것이다.

1. 손쉬운 동시성

2. 콜백에서 벗어날 수 있다.

3. 리액티브 접근

4. 손쉬운 비동기 실행


Rxjava을 이해하기 위해 가장 중요하게 필요한 개념이 옵저버 패턴이다. 옵저버 패턴에 대해 모른다면 "옵저버 패턴(1) - JDK 활용" 포스트"옵저버 패턴(2) - 직접 구현" 포스트를 보는 걸 권장한다. 옵저버 패턴에 대해 간단히 설명하면 옵저버블에 연결된 여러 개의 옵저버들이 있다. 옵저버블에서 상태가 변경되면 연결된 옵저버들에게 이를 알린다. 옵저버들이 옵저버블과 연결된 것을 subscribe 즉, 구독한다 라고 한다. Rxjava에는 Observable과 Subject 개체가 Observable에 해당하고 Observer와 Subject 개체는 옵저버에 해당한다. 간단하게 Rxjava를 사용한 예를 보자. 참고로 필자는 Rxjava를 공부했는 데 Rxjava2가 나오고 Rxjava에 대한 지원이 곧 이루어지지 않는다고 해 Rxjava2 코드를 사용할 것이고 이를 기반으로 설명할 것이다. Rxjava2에 대해 익숙하지 않아 틀린 점이 있을 수도 있으니 양해 바란다. 다음은 Rxjava2를 사용한 간단한 예이다. 

public class main { public static void main(String[] args) { Observable<String> observable = Observable.create( new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> arg0) throws Exception { arg0.onNext("Hello world");                         arg0.onComplete(); } }); observable.subscribe(new HelloworldSubscriber()); } } class HelloworldSubscriber extends DefaultObserver<String> { @Override public void onComplete() { System.out.println("Complete"); } @Override public void onError(Throwable arg0) { System.out.println("Error"); } @Override public void onNext(String item) { System.out.println("Receive: " + item); } }


- 결과


: 위 코드를 알아보자. 먼저 Observable.create를 통해 옵저버블을 생성한다. Create 메서드는 ObservableOnSubscribe 객체를 인자로 가진다. 옵저버가 옵저버블을 구독(subscribe) 하면 ObservableOnSubscribe 객체의 subscribe 메서드가 실행된다. 옵저버는 onComplete, onError, onNext 메서드를 구현해야 한다. onNext는 옵저버블에서 생성된 데이터 즉, 위 예에서는 "Hello world"를 옵저버에게 전달하는 역할을 한다. onComplete는 옵저버블이 옵저버에게 전달할 데이터가 없을 때 모든 작업을 마쳤을 때 알리는 기능을 한다. onError는 에러가 났다는 걸 옵저버에게 알리는 역할을 한다.  


여기서 구독하는 방식에 대해서 알아보자. 옵저버블은 핫과 콜드로 나뉜다. 핫 옵저버블은 데이터(아이템/시퀀스)가 생성되자 마자 발행을 시작한다. 그러면 옵저버는 처음이 아닌 중간 데이터에 대한 결과값부터 받게 된다. 콜드 옵저버블은 데이터를 발행하기 전에 옵저버가 구독할 때까지 대기한다. 위의 예제가 콜드 옵저버블이다. 따라서 옵저버는 모든 데이터에 대한 결과값을 받는다. 


Rxjava는 위 예제와 같은 패턴으로 동작한다. 더 쉬운 Observable.from과 Observable.just에 대해 알아보자. 


 - Observable.from~

: from은 리스트, 배열 안 객체를 데이터로 하는 옵저버블을 생성하거나 Future 객체의 get 결과값을 데이터로 하는 옵저버블을 생성할 수 있다. 

public class main { public static void main(String[] args) { List<Integer> items = new ArrayList<Integer>(); items.add(1); items.add(2); items.add(3); items.add(4); items.add(5); items.add(6); Observable.fromIterable(items) .subscribe(new DefaultObserver<Integer>(){ @Override public void onComplete() { System.out.println("finished"); } @Override public void onError(Throwable arg0) { System.out.println("Error!!!"); } @Override public void onNext(Integer arg0) { System.out.println(arg0+ " received"); } }); } }

- 결과

결과값을 보다시피 리스트 안에 있는 객체 차례대로 Observer에게 전달하는 걸 알 수 있다. 모든 데이터에 대해 작업이 완료되면 자동으로 onComplete가 호출된다.


 - Observable.just

: just()는 함수의 결과 값을 데이터로 하는 옵저버블을 생성할 때 주로 사용한다. 



public class main {

	public static String Hello(){
		return "Hello";
	}
	
	public static String RxJava(){
		return "RxJava";
	}
	
	public static void main(String[] args) {
			Observable.just(Hello(), " ", RxJava())
					   .subscribe(new DefaultObserver<String>(){

						@Override
						public void onComplete() {
							System.out.format("\n%s", "finish");
						}

						@Override
						public void onError(Throwable arg0) {
							System.out.println("Error");
						}

						@Override
						public void onNext(String arg0) {
							System.out.print(arg0);
						}						   
			                   });
	}
}

- 결과

just 함수의 인자값은 최대 9개까지 가능하다.

+ Recent posts