2017-11-01 6 views
0

내가이 매우 간단한 RxJava 예,이 결과를 제공RxJava 순서는, 주제는

List<Integer> arrayIntegers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); 

Observable.fromIterable(arrayIntegers).map(i -> { 
    Log.d("RxJava", "map i = " + i); 
    return i; 
}).subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread()). 
subscribe(new DisposableObserver<Integer>() { 
    @Override 
    public void onNext(Integer i) { 
     Log.d("RxJava", "next i = " + i); 
    } 

    @Override 
    public void onError(Throwable e) {} 

    @Override 
    public void onComplete() { 
     Log.d("RxJava", "Completed"); 
    } 
}); 

..

D/RxJava: map i = 1 
D/RxJava: map i = 2 
D/RxJava: map i = 3 
D/RxJava: map i = 4 
D/RxJava: map i = 5 
D/RxJava: next i = 1 
D/RxJava: next i = 2 
D/RxJava: next i = 3 
D/RxJava: next i = 4 
D/RxJava: next i = 5 

은 내가 비록 기대 한 것은이

같은 더 뭔가가 필요
D/RxJava: map i = 1 
D/RxJava: next i = 1 
D/RxJava: map i = 2 
D/RxJava: next i = 2 
D/RxJava: map i = 3 
D/RxJava: next i = 3 
D/RxJava: map i = 4 
D/RxJava: next i = 4 
D/RxJava: map i = 5 
D/RxJava: next i = 5 

나중에 onText를 onNext 콜백에서 사용하고 onCompl에서 어댑터를 새로 고침하고 싶습니다. eted 그래서 observeOn (AndroidSchedulers.mainThread())을 제거 할 수 없습니다.

이 문제는 제목으로 해결할 수 있다고 생각합니다. 누구든지 내 문제를 해결하기 위해 제목을 사용하는 방법에 대한 간단한 예가 있습니까?

+0

[RxJava 실행 순서 혼동] 가능한 복제본 (https://stackoverflow.com/questions/47056511/rxjava-order-of-execution-confusion) – xhamr

답변

1

은 내가 비록 기대되었다 더 나는이 문장하여 출력의 순서를 의미하는 것으로 가정합니다이

같은 것입니다. 구독자가 게시자와 동일한 스레드에서 구독 할 때마다 해당 주문을 받게되지만 게시자와 구독자가 서로 다른 스레드에서 실행되기 때문에 더 이상 출력 측면에서 동기화되지 않습니다. 즉 게시자가 구독자 또는 대화방을 초과 할 수 있습니다 인쇄 순서가 더 이상 보장되지 않습니다. 대신 구독이 일련의 방식으로 이벤트를 수신한다는 것이 보장됩니다.

첫 번째 출력 블록에서도 맵핑이 이벤트 다운 스트림보다 먼저 발생한다는 것을 알게 될 것입니다. 그러나 이는 사용자가 arrayIntegers에있는 데이터의 양에 의해 야기 된 환상 일 뿐이며 목록에 요소를 더 추가하고 ' 출력 패턴이 어떻게 깨지는 지 확인할 수 있습니다.