2016-06-06 9 views
6

मैं RxJava ऑपरेटर के बारे में सीख रहा हूँ, और मैंने पाया नीचे इन कोड कुछ भी प्रिंट नहीं था उपयोग कैसे करें:RxJava अंतराल ऑपरेटर

public static void main(String[] args) { 

    Observable 
    .interval(1, TimeUnit.SECONDS) 
    .subscribe(new Subscriber<Long>() { 
     @Override 
     public void onCompleted() { 
      System.out.println("onCompleted"); 
     } 

     @Override 
     public void onError(Throwable e) { 
      System.out.println("onError -> " + e.getMessage()); 
     } 

     @Override 
     public void onNext(Long l) { 
      System.out.println("onNext -> " + l); 
     } 
    }); 
} 

ReactiveX के रूप में, interval

एक नमूदार कि उत्सर्जन करता है बनाने किसी विशेष समय अंतराल से घिरे पूर्णांक का अनुक्रम

क्या मैंने कोई गलती की या कुछ भूल गए?

उत्तर

7

आप जब तक नमूदार सेवन किया जाता है ब्लॉक करने के लिए है:

public static void main(String[] args) throws Exception { 

    CountDownLatch latch = new CountDownLatch(1); 

    Observable 
    .interval(1, TimeUnit.SECONDS) 
    .subscribe(new Subscriber<Long>() { 
     @Override 
     public void onCompleted() { 
      System.out.println("onCompleted"); 
      // make sure to complete only when observable is done 
      latch.countDown(); 
     } 

     @Override 
     public void onError(Throwable e) { 
      System.out.println("onError -> " + e.getMessage()); 
     } 

     @Override 
     public void onNext(Long l) { 
      System.out.println("onNext -> " + l); 
     } 
    }); 

    // wait for observable to complete (never in this case...) 
    latch.await(); 
} 

आप नमूदार पूरा देखने के लिए उदाहरण के लिए .take(10) जोड़ सकते हैं।

+0

अच्छा, बूट करने के लिए उलटी गिनती का एक साफ उदाहरण। Rxjava 2 में – mtyson

+0

, क्या एकल के साथ अंतराल का उपयोग करने का कोई तरीका है? –

2

सदस्यता लेने के बाद Thread.sleep(1000000) रखो और आप इसे काम देख पाएंगे। Observable.interval डिफ़ॉल्ट रूप से Schedulers.computation() पर संचालित होता है ताकि आपकी स्ट्रीम मुख्य थ्रेड के अलावा किसी थ्रेड पर चल रही हो।

+0

हाँ, यह सही है की जरूरत है मेरी GitHub में अधिक उदाहरण है। अंतराल ऑपरेटर एसिंक्रोनस तरीके से चल रहा है, इसलिए मुझे इसके परिणाम प्राप्त करने के लिए abd प्रतीक्षा को अवरुद्ध करने की आवश्यकता है। धन्यवाद! –

0

जैसा कि वे आपको बताते हैं कि पहले से ही अंतराल अतुल्यकालिक काम करता है, इसलिए आपको सभी घटनाओं को समाप्त करने की प्रतीक्षा करनी होगी।

सदस्यता लेने के बाद आप सदस्यता प्राप्त कर सकते हैं और फिर टेस्टसब्रिबर का उपयोग करें जो कि रेएक्टिवएक्स प्लेटफॉर्म का हिस्सा है, और जो आपको सभी घटनाओं को समाप्त करने की प्रतीक्षा करने के लिए सुविधा देगा।

 @Test 
public void testObservableInterval() throws InterruptedException { 
    Subscription subscription = Observable.interval(1, TimeUnit.SECONDS) 
       .map(time-> "item emitted") 
       .subscribe(System.out::print, 
         item -> System.out.print("final:" + item)); 
    new TestSubscriber((Observer) subscription) 
      .awaitTerminalEvent(100, TimeUnit.MILLISECONDS); 
} 

मैं अगर तुम https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/scheduler/ObservableAsynchronous.java