woong's

RxJava , RxAndroid 사용하기[1 : 흐름 파악하기] 본문

Develop/Android

RxJava , RxAndroid 사용하기[1 : 흐름 파악하기]

dlsdnd345 2016. 2. 14. 13:15

RxJava , RxAndroid 사용하기[1 : 흐름 파악하기]


최근 RXJava , RxAndroid 얘기가 많아 조금씩 학습해 보려 합니다.

이번장에서는 정말 맛보기 정도로만 사용해보려 합니다.

포스트를 끝까지 다 쓸수 있을지 모르겠지만 , 

궁극적으로는 retrofit + RxJava 까지 포스트를 작성해 보려 합니다.

처음에는 어떤점이 장점이 되는지 몰랐지만 , retrofit + RxJava 까지 적용해보니

아 이럴때 이런점이 좋겠구나 하는 생각이 들었습니다.

학습비용이 어느정도 필요하지만 , 조금씩 시간내서 학습하면 , 앞으로 좀더

질좋은 코드를 쉽게 작성할수 있지 않을까 하는 생각이 듭니다.



1.사용준비

RxJava , RxAndroid 를 사용하기 위해서 라이브러리 준비를 해야 합니다.

RxAndroid 내부에 RxJava가 있어 따로 추가를 해주지 않아도 된다고 합니다.


1
2
3
4
5
6
7
8
9
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'io.reactivex:rxandroid:0.24.0'
}
 
 
 
cs



2. 간단설명


RxJava 는 함수형 프로그래밍 이라고 합니다.

Android 개발자 사이에서 부상되고 있으며 , 저도 학습하는 입장에서 간단하게 어떻게 사용되는지만 

설형해보려 합니다 ^^


Observable , Subscriber 가 주로 자주 사용하게 됩니다.

Observable : 아이템 들을 발행

Subscriber : 아이템 들을 소비



3.사용방법


간단하게 Ovservable , Subscriber 가 어떻게 동작하지는 확인해 보겠습니다.

Ovservable 을 생성하였고 , call 익명 함수에서 Next , Completed 를 호출 하였습니다.

이렇게 호출이 되면 Subscriber 는 구독을 합니다. 

onNext 에서 구독을 하고 onCompleted 에서 구독을 하여 Log를 보여주게 됩니다.


1
2
3
4
5
6
onNext  : >>> Hello world
>>> onCompleted  :
cs



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
32
33
34
//발행
Observable<String> observable = Observable.create(
        new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<super String> sub) {
                sub.onNext(">>> Hello world");
                sub.onCompleted();
            }
        }
);
 
//구독을 하며 소비
Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        System.out.println(s);
        Log.i(TAG, ">>> onNext  : " + s);
    }
 
    @Override
    public void onCompleted() {
        Log.i(TAG, ">>> onCompleted  : ");
    }
 
    @Override
    public void onError(Throwable e) {
        Log.i(TAG, ">>> onError  : " + e);
    }
};
 
observable.subscribe(subscriber);
 
 
 
cs



이렇게 흐름 방법을 알아보았는데 , 간단한 호출만 했을뿐인데 벌써 코드가 굉장히 길어졌습니다. 

여러 가지 방법으로 코드를 간소화 할수 있는데 Ovservable 을 간소화 해보도록 하겠습니다.

Ovservable 에는 여러개의 메서드가 내장 되어 있는데 Ovservable.just() 를 사용해 보겠습니다.

Ovservable.just() 는 아이템을 한개만 발행 하고 종료 됩니다.


1
Observable<String> observable = Observable.just("hello world");
cs

 


다음으로는 Subscriber 를 간소화 해보도록 하겠습니다.

위 Subscriber 를 보면 onNext , onCompleted , onError 가 있습니다. 필요에 따라 필요 할수도 있고

없을 수도 있습니다. 이부분을 분리 할수 있습니다. 분리 할수 있으며 , 사용하고 싶은것만 사용할수 있습니다.

아래 코드는 3부분을 다 사용하였지만 , 기호에 따라 골라서 사용 할 수 있습니다.


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
Action1<String> onNextAction = new Action1<String>() {
    @Override
    public void call(String s) {
        Log.i(TAG, ">>> onNextAction  : " + s);
    }
};
 
 
Action1<Throwable> onErrorAction = new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
        Log.i(TAG, ">>> onErrorAction  : " + throwable);
    }
};
 
 
Action0 onCompletedAction = new Action0() {
    @Override
    public void call() {
        Log.i(TAG, ">>> onCompletedAction ");
    }
};
 
observable.subscribe(onNextAction, onErrorAction, onCompletedAction);
 
 
 
 
cs

 


여기서 NextAction 만 사용한다는 전제로 포스트를 작성해 보겠습니다.

위의 장황했던 코드가 필요한 부분을 사용하고 코드를 간소화 하니 아래의 코드같이 작성되었습니다.


1
2
3
4
5
6
7
8
9
10
//발행
Observable<String> observable = Observable.just("hello world");
//구독
Action1<String> onNextAction = new Action1<String>() {
    @Override
    public void call(String s) {
        Log.i(TAG, ">>> onNextAction  : " + s);
    }
};
observable.subscribe(onNextAction);
cs


여기서 Java8 에서 소개된 람다를 사용하여 익명함수를 줄이게 되면  


1
Observable.just(“Hello, world!”) .subscribe(s -> System.out.println(s));
cs


위와 같이 코드를 사용할수 있습니다.

하지만 이 포스트는 람다를 배우기 위하기 보다 RxJava에 대해서 소개하니 생략하겠습니다.


결론 


여기까지는 간단하게 RxJava 가 어떻게 사용되는지 흐름을 알아보는 정도가 되겠습니다.

어떻게 발행되고 구독이 되는지 , 역할이 분명하게 나뉘는것 같습니다.

아직까지는 어떤점이 장점이 되는지 명확하지 않는것 같습니다.

다음포스트에서 어떤점에서 이점이 있는지 알아보는 포스트를 작성해보려 합니다. ^^

'Develop > Android' 카테고리의 다른 글

Path Menu  (0) 2016.02.14
RxJava , RxAndroid 사용하기[2 : filter , map 사용]  (1) 2016.02.14
Android Java 파일 경로 / 포함하기  (0) 2016.02.14
Android VideoView error 처리하기  (0) 2016.02.14
Android Lambda 사용하기  (0) 2016.02.14
Comments