...

반응형

asynctask를 잘 쓰고 있었는데 이제 deprecated 된다고 해서 찾아보니 

RxAndroid를 써야 될거 같은데 생각보다 어렵더라고요

RxJava로 안써봐서 잘 이해가 안되서 이런저런 자료 찾아본걸 정리합니다

 

Observable.create

  • - Observable가 아이템을 발행하기 위해서는 onNext(), onError(), onCompleted()를 적절히 호출해야 된다

 

  • - onError()과 onCompleted()는 동시에 호출할 수 없는 상호 배타적 관계로 onError()가 호출 될때는 onCompleted()를 호출하지 않아야 되고 반대도 마찬가지

 

  • - onError()과 onCompleted() 중 하나가 호출된 이후에는 Observable의 어떤한 연산자도 호출하지 않아야 된다

 

  • - subscribeOn이 Schedulers.io()일 경우 onComplete를 호출하지 않으면 계속해서 대기상태

 

  • - create()를 사용할때 Observable가 데이터를 방출(emit) 하기 전에 구독자가 구독취소를 하게 되면 UndeliverableException 발생

 

Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() {
	@Override
	public void subscribe(ObservableEmitter<String> emitter) throws Exception {
		emitter.onNext("1");
		emitter.onNext("3");
		emitter.onNext("5");
	}
}).subscribeOn(Schedulers.io())
		.observeOn(AndroidSchedulers.mainThread());

observable1.subscribe(new Observer<String>() {
	@Override
	public void onSubscribe(Disposable d) {

	}

	@Override
	public void onNext(String s) {
		Log.i("sinwhod","onNext = " + s);
	}

	@Override
	public void onError(Throwable e) {

	}

	@Override
	public void onComplete() {
		Log.i("sinwhod","onComplete");
	}
});

Observable.just

  • - 데이터를 바로 방출할때 사용

 

  • - onNex()나 onComplete()등과 같이 별도로 메서드를 호출할 필요가 없고 just()로 데이터만 넘겨주면 옵저버의 역할은 끝

 

// Observer에 data를 보냄
Observable observable = Observable.just(data);

// Observable에서 보낸 데이터를 받음
Observer<String> observer = new Observer<String>() {
	@Override
	public void onSubscribe(Disposable d) {
		Log.i("sinwhod","Disposable = " + d);
	}

	@Override
	public void onNext(String s) {
		Log.i("sinwhod","onNext = " + s);

	}

	@Override
	public void onError(Throwable e) {
		Log.i("sinwhod","onError = " + e);

	}

	@Override
	public void onComplete() {
		Log.i("sinwhod","onComplete");
	}
};

observable
		.subscribeOn(Schedulers.newThread())    // 멀티쓰레드를 적용하고자 할때 사용, subscribeOn는 메인쓰레드가 아닌 어디서 실행할지 설정?
		.observeOn(AndroidSchedulers.mainThread())  // Observable에서 보낸 데이터를 Observer가 받아서 subscribe 할때, 데이터를 가공해서 어디다 그 결과를 보낼지 설정
		.subscribe(observer);   // Observable에서 보낸 데이터를 받을 Observer 지정(Observable와 Observer를 연결)

Observable.defer

  • - defer로 생성된 Observable는 create나 just와 다르게 옵저버가 구독하기 전까지는 Observable를 생성하지 않는다

 

  • - defer은 subscribe가 호출될때 할당

 

  • - 각각의 옵저버에게 매번 새로운 Observable를 생성, 즉 subcribe() 함수를 호출할 때까지 stream 생성을 미루면서 호출될때마가 새로운 Observable을 생성하여 데이터를 보낸다

 

  • - just와 같이 onNext나 onCompleted등을 호출할 필요 없음

 

Observable.fromCallable

  • - fromCallable은 defer와 마찬가지로 스트림 생성을 지연하는 효과를 가지고 있음

 

- 차이점은 데이터를 방출(emit) 할 때 추가로 Observable을 생성하지 않고 바로 데이터를 스트림으로 전달할 수 있다는 점

반응형