RxJava


RxJava 데이터 형태와 가공자


Completable Single Maybe Observable Subject
Nothing O
One O O O O
More O O
Unlimited O O
  • RxJava에서 데이터 형태는 4가지 형태로 Nothing, One, More, Unlimted가 있습니다.
  • 데이터 형태에 따라서 4가지로 처리 할 수 있습니다.(RxJava1 기준, RxJava2 Maybe 추가)
    • Maybe는 Optional Type을 깔끔하게 처리 할 수가 있습니다.

  • 작업이 종료됨과 동시에 1개의 Item 만을 전파하는 Single.
  • 발행하는 Item은 없이 작업의 종료만을 전파하는 Completable
1
2
3
4
5
6
7
8
9
10
Single.fromCallable(dao::findAll)
.subscribeOn(Schedulers.io())
.subscribe(
books -> {
// Next Step
},
throwable -> {
// Error handling
}
);

1
2
3
4
5
6
7
8
9
10
Completable.fromAction(heavyJob::run)
.subscribeOn(Schedulers.io())
.subscribe(
() -> {
// Next Step
},
throwable -> {
// Error handling
}
);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Maybe.just("Maybe")
.subscribe(
::println, // onSuccess
{ it.printStackTrace() }, // onError
{ println("onComplete") } // onComplete
)
// Output > Maybe

Maybe.fromCallable {
val nullableStr: String? = null // nullableStr
}.subscribe(
::println, // onSuccess
{ it.printStackTrace() }, // onError
{ println("onComplete") } // onComplete
)
// Output > onComplete

마블 다이어그램




  • 순차적이고 반복적으로 각각의 element에 접근이 가능한 형태 Observable

  • Observable 처럼 행동하는 형태와 Observer 둘 다 될수 있는 형태의 Subject

    • Observable : 데이터의 스트림
    • Observer : Observable이 보낸 데이터의 스트림을 받음
  • Cold Observable, Hot Observable


일반적인 RxJava 구조



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Observable.just(filename)
.map(new Func<String, String>() {
@Override
public String call(String s) {
File file;
try {
file = File.createTempFile(filename, null, getCacheDir());
storedCacheName = file.getName();
} catch(IOException e) {
e.printStackTrace();
}
return storedCacheName;
}
})
.subscribeOn(Schedulers.io()) // 워커 쓰레드 지정
.observeOn(AndroidSchedulers.mainThread()) // Observable가 보내준 데이터 결과를 어디서 사용 하는가?
.subscrbe(new Observer<String>() {
@Override
public void onNext(String s) {
mResulteText.setText(s);
}

@Override
public void onError(Throwable e) {
Lod.e(TAG, e.getMessage());
}

@Override
public void onCompleted() {
}
});