2017년 6월 3일 토요일

[STUDY] RxAndroid Part 4 (Observable - Create/Defer/Empty/Never/Throw/Never/Throw/From/Interval 등)


[목차]==================================================
1. Observable을 만드는 Operator 목록
2. Create 
3. Defer
4. Empty/Never/Throw
5. From
6. Interval
7. Just
8. Range
9. Repeat
10. Start
11. Timer
======================================================


Observable을 좀 더 쉽게 만들 수 있는 방법이 있습니다.
바로 미리  생성된 Operator를 사용하는 것 입니다


1. Observable을 만드는 Operator 목록

just( ) — convert an object or several objects into an Observable that emits that object or those objects
from( ) — convert an Iterable, a Future, or an Array into an Observable
repeat( ) — create an Observable that emits a particular item or sequence of items repeatedly
repeatWhen( ) — create an Observable that emits a particular item or sequence of items repeatedly, depending on the emissions of a second Observable
create( ) — create an Observable from scratch by means of a function
defer( ) — do not create the Observable until a Subscriber subscribes; create a fresh Observable on each subscription
range( ) — create an Observable that emits a range of sequential integers
interval( ) — create an Observable that emits a sequence of integers spaced by a given time interval
timer( ) — create an Observable that emits a single item after a given delay
empty( ) — create an Observable that emits nothing and then completes
error( ) — create an Observable that emits nothing and then signals an error
never( ) — create an Observable that emits nothing at all
 package tiii.com.rxandroid;
import android.os.Bundle;
import android.widget.TextView;
import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import rx.Observable;
import rx.functions.Action1;

public class MainActivity extends RxAppCompatActivity {
    public static final String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Observable
                .just("Hello RxAndroid !!")
                .compose(this.<String>bindToLifecycle())
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        ((TextView) findViewById(R.id.textview)).setText(s);
                    }
                });
    }
}


2. Create 
  • 수동으로 옵져버 메소드 호출하여 새로운 Observable을 생성
  • 언뜻본다면 큰 문제는 없어 보인다.
    물론 Observable.from() 를 사용한다면 subscriber.onComplete() 와 같은 코드를 신경쓰지 않고 더 편하게 사용이 가능하다
    하지만 Observable.just() 나 Observable.from() 와 같은 경우 발행되는 Item 들이 observable 생성시점에 이미 정해져있어야 한다.
    즉 Database 상에서 데이터를 읽어 오는 작업과 같이 비용이 큰 작업들을 비동기로 처리하고자 할 때에는 적절하지 않다.
  • 이처럼 Observable.create() 만으로는 간단한 비동기 처리 흐름을 만들기는 어려운 작업이며 실수할 여지가 매우 많다.
    그래서 많은 개발자들은 Observable.create() 대신 Observable.defer() 를 사용하는걸 추천한다.

Create

Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<super String> subscriber) {
        try {
            subscriber.onNext("Hello_Create");
            subscriber.onCompleted();
        } catch (Exception e) {
            subscriber.onError(e);
        }
    }
})
.compose(mMainView.ActivityLifecycleProvider().bindToLifecycle())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
            Log.d(TAG, s);
            mMainView.TextChange(s);
        },
        throwable -> throwable.printStackTrace(),
        () -> {
            Log.d(TAG, "onComplete");
            LogTextView();
        }
);


3. Defer 
  • 구독하기 전까지 Observable을 생성하지 않습니다. 그리고 각각의 옵져버에게 매번 새로운 Observable을 생성합니다.
  • 다른 생성 오퍼레이터와 다른 점이 뭔지 애매했었는데 데이타스트림이 메모리에 할당되는 타이밍이 다른 것이 였습니다. 다른 오퍼레이터들은 오퍼레이터를 선언하는 순간 메모리에 할당 되지만 defer는 subscribe가 호출 될 때에 할당 된다고 합니다.
Defer

 Observable.defer(() -> {
    return SomethingLongTask(); //return Observable<String>
})
.compose(mMainView.ActivityLifecycleProvider().bindToLifecycle());
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
            Log.d(TAG, s);
            mMainView.TextChange(s);
        },
        throwable -> throwable.printStackTrace(),
        () -> {
            Log.d(TAG, "onComplete");
            LogTextView();
        }
);

  • Observable.defer() 비동기로 observable 을 생성하고 하위 스트림에서 사용할 수 있도록 해준다.
 Observable.defer(() -> {
    List<Book> books = dao.findAll();
    return Observable.just(books);
  })

  .subscribeOn(Schedulers.io())
  .subscribe(books -> {
    // Next Step
  }, throwable -> {
    // Error handling
  });
 여기서는 dao.findAll() 을 통해 반환된 결과를 Observable.just() 를 사용하여 새로운 작업흐름을 만들고 반환하였다.
observable 을 만들기 위한 observable 이 필요하다는 점에서 추가되는 비용이 있지만 Observable.create() 보다는 훨씬 간결한 코드가 만들어졌다.
명시적으로 onComplete() 나 onError() 를 처리해줄 필요가 없으며, subscriber 의 구독상태를 확인할 필요도 없다.

4. Empty/Never/Throw
매우 정확하고 제한적인 행동의 Observable을 생성합니다.
1) Empty
  • 방출하는 아이템이 없고 정상적으로 종료되는 옵저버블을 생성합니다.
    Empty
    2) Never
  • 방출하는 아이템이 없고 종료되지 않는 옵저버블을 생성합니다.
    Never
    3) Throw
  • 방출하는 아이템이 없고 에러를 발생하여 종료되는 옵저버블을 생성합니다.
Throw

5. From
  • 배열이나 Iterable의 요소를 순차적으로 방출 시키는 Observable으로 변환
에서

6. Interval

  • 특정한 시간 간격으로 아이템을 방출하는 Observable을 생성합니다.
  • 일정시간 마다 반복적인 작업이 필요할 때 사용
Interval


  • 7. Just
    • 오브젝트나 오브젝트셋을 바로 방출하는 Oservable으로 변환
    • 만약에 아무것도 하지 않는 옵저버블을 만들기 위해 null 을 넣는다면 null을 방출하는 옵저버블이 만들어 집니다.
    • 아무것도 하지 않은 옵저버블을 원하신다면 empty를 사용하시면 됩니다.
    Just


    8. Range
    • 정수의 순차적인 범위를 가지고 있는 Observable을 생성
    • Interval과 비슷하지만 반복횟수의 제한이 있습니다. m개 만큼의 반복
    Range


    9. Repeat
    • 일정 횟수를 반복하는 Observable을 생성
    • 이 오퍼레이터는 단독으로 사용되지 않고 다른 오퍼레이터 뒤에 붙여서 사용되며 .Repeat(n) 바로 앞 오퍼레이터를 일정횟수 만큼 반복
    Repeat

    10. Start
    Start
    11. Timer
    • 일정 시간의 딜레이 이후에 단일 항목을 방출하는 Observable을 생성
    Timer




  • 출처 : 인터넷에서 RxAndroid 검색하여 필요한 정보를 다양한 사이트에서 종합하여 작성된 것입니다. 많은 사이트 내용을 종합하여 공부하여 작성하다보니 일일이 나열하지 못하였습니다. ㅈㅅ(_ _) 이글은 자유롭게 퍼 가셔서 도움이 되었으면 좋겠습니다. 감사합니다. 

    댓글 없음:

    댓글 쓰기