1. 실행 조치를 지연시킵니다
타이머+맵 메소드를 사용하여 구현할 수 있습니다. 코드는 다음과 같습니다.
Observable.timer (5, TimeUnit.milliseconds) .map (value-> {return dosomething ();}). 구독 (System.out :: println); } 2. 전송 결과를 지연시킵니다
이 시나리오는 데이터를 생성하는 작업을 즉시 실행해야하지만 결과는 전송에 지연됩니다. 이것은 위의 시나리오와 다릅니다.
이 시나리오는 Observable.zip 사용하여 구현할 수 있습니다.
ZIP 연산자는 여러 관측 가능에 의해 전송 된 데이터를 순서대로 결합하며 각 데이터는 한 번만 결합 할 수 있으며 모두 주문됩니다. 최종 결합 데이터의 수는 관찰 가능에 의해 결정되며, 이는 최소 데이터를 전송합니다.
관찰 가능한 각각의 동일한 위치에있는 데이터의 경우 서로 기다려야합니다. 즉, 첫 번째 관찰 가능한 첫 번째 위치에있는 데이터가 생성 된 후에 생성 될 수있는 두 번째 관찰 가능한 첫 번째 위치의 데이터를 기다려야하며, 각 관측 가능의 동일한 위치에있는 데이터가 생성되면 지정된 규칙에 따라 결합 할 수 있습니다. 이것이 실제로 우리가 사용하고 싶은 것입니다.
zip에는 여러 종류의 선언이 있지만, 거의 동일하며, 이는 거의 동일하며, 이는 여러 관찰 가능성을 전달한 다음 각 관측 가능의 해당 위치에서 데이터를 처리하는 규칙을 지정하고 새로운 데이터를 생성합니다. 다음은 가장 간단한 것 중 하나입니다.
public static <t1, t2, r> vistionable <r> zip (관찰 가능한 <? 확장 t1> o1, 관찰 가능 <? extends t2> o2, 최종 func2 <? super t1,? super t2, extends r> zipfunction);
zip을 사용하여 푸시 및 보내기의 실행 결과는 다음과 같습니다.
Observable.zip (Observable.Timer (5, timeUnit.milliseconds), Observable.Just (dosomething ()), (x, y)-> y) .subscribe (System.out :: println));
3. 지정된 스레드에서 특정 작업을 수행하려면 연기를 사용하십시오.
다음 코드에서와 같이 스레드의 실행 방법을 지정하지만 doSomething() 함수는 현재 코드에서 불리는 스레드에서 여전히 실행됩니다.
Observable.Just (dosomething ()) .subscribeon (schedulers.io ()) .observeon (schedulers.computation ()) .subscribe (v-> utils.printlnwiththread (v.tostring ());
일반적으로 목표를 달성하기 위해 다음 방법을 사용합니다.
Observable.create (s-> {s.onnext (dosomething ());}) .subscribeon (schedulers.io ()) .observeon (schedulers.computation ()) .subscribe (v-> {utils.printlnwiththread (v.tostring ());그러나 실제로 우리는 연기를 사용하여 동일한 목표를 달성 할 수 있습니다.
연기에 대해
연기 연산자는 다른 연산자 및 기타 연산자와 동일합니다. 클래스 연산자를 생성하지만이 연산자와 관련된 모든 데이터는 구독하는 경우에만 적용됩니다.
성명:
public static <t> 관찰 가능 <t> 연기 (func0 <관찰 가능 <t >> 관찰 가능한 변형);
DEFER의 FUNC0에서 관찰 가능한 것은 구독 할 때만 생성됩니다.
효과:
관찰자가 가입 할 때까지 관찰 가능한 것을 만들지 마십시오. 각 구독에서 신선한 관찰 가능한 것을 만듭니다.
다시 말해, 구독 할 때 관찰 가능한 것이 생성됩니다.
위의 문제는 연기로 구현됩니다.
Observable.defer (()-> veriverse.just (dosomething ())) .subscribeon (schedulers.io ()) .observeon (schedulers.computation ()) .subscribe (v-> {utils.printlnwiththread (v.toString ()); 4. Compose를 사용하여 체인 구조를 깨지 마십시오
우리는 종종 다음 코드를 봅니다.
Observable.just (dosomething ()) .subscribeon (schedulers.io ()) .observeon (schedulers.computation ()) .subscribe (v-> {utils.printlnwiththread (v.tostring ()); 위의 코드에서, subscribeOn(xxx).observeOn(xxx) 여러 곳에서 동일 할 수 있습니다. 특정 장소에서 구현할 계획이라면 다음과 같이 쓸 수 있습니다.
개인 정적 <T> 관찰 가능 <T> ApplySchedulers (Observable <T> Observable) {Return Observable.Subscribeon (Schedulers.io ()) .Observeon (Schedulers.computation ()); }그러나 위의 방법을 호출해야 할 때마다 대략 다음과 같으며 가장 바깥 쪽은 링크 구조를 깨는 것과 동일합니다.
ApplySchedulers (Observable.from (someSource) .map (new func1 <data, data> () {@override public data call (data data) {return manipulate (data);}}) .subscribe (new Action1 <data> (@override public void call (data data)});Compose 연산자는 링크 구조를 깨지 않는 목적을 달성하는 데 사용될 수 있습니다.
Compose의 진술은 다음과 같습니다.
공개 관찰 가능한 작곡 (변압기 <? super t,? extends r> transformer);
들어오는 매개 변수는 변압기 인터페이스이며 출력은 관찰 가능합니다. 변압기는 실제로 Func1<Observable<T> , Observable<R>> 입니다. 즉, 한 가지 유형의 관찰 가능한 것은 다른 유형의 관찰 가능한 것으로 변환 될 수 있습니다.
간단히 말해서, Compose는 지정된 변환 방법 (입력 파라미터 변압기)을 통해 원래 관측 가능성을 다른 관찰 가능한 다른 것으로 변환 할 수 있습니다.
Compose를 통해 다음 방법을 사용하여 스레드 메소드를 지정하십시오.
Private STATIC <T> 변압기 <T, T> ApplySchedulers () {return New Transformer <T, T> () {@OverRide Public Observable <T> Call (Observable <T> Observable) {Return Observable.Subscribeon (Schedulers.io ()) }}; } Observable.Just (dosomething ()). compose (applySchedulers ()) .SubScribe (v-> {utils.printlnwiththread (v.toString ());});기능 적용 체계 디디너는 Lambda 표현식을 사용하여 다음과 같은 추가 단순화 할 수 있습니다.
Private STATIC <T> 변압기 <T, T> ApplySchedulers () {Return Observable-> Observable.Subscribeon (Schedulers.io ()) .Observeon (Schedulers.computation ()); } 5. 우선 순위에 따라 다른 실행 결과를 사용하십시오
위의 제목은 아마도 내가 명확하게 표현하고 싶었던 시나리오를 표현하지 않았을 것입니다. 실제로, 내가 표현하고 싶은 시나리오는 네트워크 데이터를 얻는 일반적인 시나리오와 유사합니다. 캐시가 있으면 캐시에서 얻을 수 있으며, 그렇지 않으면 네트워크에서 얻을 수 있습니다.
여기에서 캐시가 있으면 네트워크에서 데이터를 얻는 동작이 수행되지 않아야합니다.
Concat+First를 사용하여 구현할 수 있습니다.
연결은 여러 관측 가능성을 하나의 관찰 가능한 하나로 통합하고 최종 관측 가능성을 반환합니다. 그리고 이러한 데이터는 관찰 가능한 사람에게서 전송되는 것과 같습니다. 매개 변수는 관측부를 포함하는 다중 관측형 또는 반복자 일 수 있습니다.
새로운 관찰 가능한 데이터의 데이터는 원래 동의에서 관찰 가능한 순서대로 배열됩니다. 즉, 새로운 결과의 데이터는 원래 순서로 정렬됩니다.
다음은 위의 요구 사항을 구현하는 것입니다.
Observable.concat (getDataFromCache (), getDataFromnetwork ()). first () .subscribe (v-> system.out.println ( "result :"+v)); // 캐시에서 데이터 가져 오기 개인 정적 정적 관찰 가능 <string> getDataFromCache () {return Observable.Create (s-> {// dosomething to int value = new random (). nextInt (); value = value%2; if (value! = 0) {S.onnext ( "캐시에서 :"+값을 만들기); s.oncompleted (); } // 네트워크에서 데이터 가져 오기 개인 정적 관측 가능 <string> getDataFromnetwork () {return Observable.create (s-> {or (int i = 0; i <10; i ++) {utils.println ( "Obs2 Generate"+I); "+i);"+i); }위의 구현에서 GetDataFromCache에 데이터가있는 경우 getDataFromNetwork의 코드는 실행되지 않습니다. 이것이 바로 우리가 원하는 것입니다.
위의주의가 필요한 몇 가지 구현이 있습니다.
1. 두 곳에서 데이터를 얻을 수 없을 수 있습니다. 이 시나리오에서 먼저 사용하면 예외 NosuchelementException이 발생합니다. 이 시나리오가 경우 위의 첫 번째 시나리오를 FirstOrdeFault로 바꿔야합니다.
2. 위의 getDataFromCache() 에서 데이터가 없으면 직접 온다. OnCompleted를 호출하지 않고 OnError를 호출하면 위에서 언급 한 CONCAT의 사용은 아무런 결과도 얻지 못할 것입니다. CONCAT가 오류를 받으면 병합이 중지되기 때문입니다. 따라서 OnError를 사용하려면 ConcatDelayError를 concat.concatDelayError ConcatDelayError는 먼저 오류를 무시하고 최종 처리까지 오류를 연기합니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용이 귀하의 연구 나 업무에 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.