[RxJava] RxJava의 잘못된 이해 학습

4699 단어
RxJava 문법에 대한 질문과 이해fromCallablejust 조작부호의 사용에 대한 문제점을 코드에 대한 분석을 하겠습니다.

코드 사상

/**
*     
**/
String getMessage() {
    Log.d("RxJava", Thread.currentThread().getName());
    return "getMessage";
}

/**
*   
**/
Subscriber<Object> getSubscriber() {
    return new Subscriber<Object>() {
        @Override
        public void onCompleted() {
            Log.d("RxJava", "onCompleted");
        }

        @Override
        public void onError(Throwable e) {
            Log.d("RxJava", "onError : " + e.toString());
        }

        @Override
        public void onNext(Object o) {
            Log.d("RxJava", "onNext : " + o);
            Log.d("RxJava", Thread.currentThread().getName());
        }
    };
}
fromCallable 연산자 사용
public void run() {
    Observable<String> o = Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
                return getMessage();
            }
        });
    o.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(getSubscriber());
}
just 연산자 사용
public void run() {
    Observable<String> o = Observable.just(getMessage());
    o.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(getSubscriber());
}

실행 결과 fromCallable를 사용할 때 getMessage는 하위 라인에서 실행되고 just는 주 라인에서 실행됩니다.
원작자가 내린 결론은 Observable을 사용하는 것이다.fromCallable () 방법은 두 가지 장점이 있습니다:   1.전송할 데이터를 가져오는 코드는 Observer가 구독한 후에만 실행됩니다.  2.데이터를 가져오는 코드는 하위 라인에서 실행할 수 있습니다.
나는 이러한 결론에 문제가 있다고 생각한다. 내가 코드를 수정해서 분석해 보겠다.

Observable<String> getObservable(final String s) {
    return Observable.fromCallable(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return s;
        }
    });
}

public void run() {
    Observable<String> o = Observable.getObservable(getMessage());
    o.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(getSubscriber());
}

실행 결과 getMessage가 주 스레드에서 실행되고 있음을 알 수 있습니다.왜 그럴까?사실 이것이 바로 자바 언어의 호출 순서의 문제이지 조작부호의 기능이 아니다.Rxjava를 공부하는 과정에서 원래의 자바 언어 구조에서 벗어나지 않기를 바랍니다. 왜냐하면 라jva의 원본 코드도 자바 언어가 쓴 것이기 때문입니다.

좋은 웹페이지 즐겨찾기