2015-03-03 18 views
6

उन सभी RxJava सामग्री को समझने की कोशिश कर रहा है। मैं निम्न उदाहरण कर रहा था:Android RxJava सूचियों की सूची

private Observable<List<String>> query1() { 
    List<String> urls = new ArrayList<>(); 
    urls.add("1"); 
    urls.add("2"); 
    urls.add("3"); 
    urls.add("4"); 

    return Observable.just(urls); 
} 

private Observable<List<String>> query2() { 
    List<String> urls = new ArrayList<>(); 
    urls.add("A"); 
    urls.add("B"); 
    urls.add("C"); 
    urls.add("D"); 

    return Observable.just(urls); 
} 

और उसके बाद दो सूचियों में शामिल होने की कोशिश की:

Observable.zip(
      query1(), 
      query2(), 
      new Func2<List<String>, List<String>, Observable<String>>() { 
       @Override 
       public Observable<String> call(List<String> a1, List<String> a2) { 
        List<String> list = new ArrayList<>(); 
        list.addAll(a1); 
        list.addAll(a2); 
        return Observable.from(list); 
       } 
      }) 
      .subscribe(new Action1<String>() { // <-- It says, cannot resolve method subscribe 
       @Override 
       public void call(String string) { 
        String text = testTextView.getText().toString(); 
        testTextView.setText(text + "\n" + string); 
       } 
      }); 

क्या मैं गलत कर रहा हूँ? मैं मेरे विचार में प्राप्त करने के लिए उम्मीद कर रहा था एक बी सी डी

EDIT1 मैं निम्नलिखित जवाब के साथ समाप्त हो गया:

Observable.zip(
      query1(), 
      query2(), 
      new Func2<List<String>, List<String>, List<String>>() { 
       @Override 
       public List<String> call(List<String> a1, List<String> a2) { 
        List<String> list = new ArrayList<>(); 
        list.addAll(a1); 
        list.addAll(a2); 
        return list; 
       } 
      }) 
      .flatMap(new Func1<List<String>, Observable<String>>() { 
       @Override 
       public Observable<String> call(List<String> urls) { 
        return Observable.from(urls); 
       } 
      }) 
      .subscribe(new Action1<String>() { 
       @Override 
       public void call(String string) { 
        String text = testTextView.getText().toString(); 
        testTextView.setText(text + "\n" + string); 
       } 
      }); 

EDIT2concat समाधान जैसा कि इस मामले में ihuk द्वारा सुझाया गया होगा बेहतर होगा। सभी उत्तरों के लिए सराहना करें।

उत्तर

17

मेरा मानना ​​है कि ऑपरेटरों आप देख रहे हैं concat या merge हैं।

Concat एस से बिना उत्सर्जन उत्सर्जन उत्सर्जित करेगा।

Merge दूसरी तरफ उनके उत्सर्जन विलय करके कई अवलोकनों को जोड़ देगा।

उदाहरण के लिए:

String[] numbers = {"1", "2", "3", "4"}; 

    String[] letters = {"a", "b", "c", "d"}; 

    Observable<String> query1 = Observable.from(numbers).delay(1, TimeUnit.SECONDS); 
    Observable<String> query2 = Observable.from(letters); 

    Observable 
      .concat(query1, query2) 
      .subscribe(s -> { 
       System.out.printf("-%s-" + s); 
      }); 

-1--2--3--4--a--b--c--d- प्रिंट होगा। यदि आप concat को merge के साथ प्रतिस्थापित करते हैं तो परिणाम -a--b--c--d--1--2--3--4- होगा।

Zip ऑपरेटर निर्दिष्ट फ़ंक्शन के माध्यम से कई Observable एस को एक साथ जोड़ देगा। उदाहरण के लिए

Observable 
      .zip(query1, query2, (String n, String l) -> String.format("(%s, %s)", n, l)) 
      .subscribe(s -> { 
       System.out.printf("-%s-", s); 
      }); 

उत्पादन -(1, a)--(2, b)--(3, c)--(4, d)- होगा।

+0

'concat' उदाहरण के लिए धन्यवाद। – krisk

1

thats क्योंकि आप ज़िप समारोह से नमूदार वापस जाने के लिए कोशिश कर रहे हैं, लेकिन फिर आप पारित Action<String>

Observable.zip(
      query1(), 
      query2(), 
      new Func2<List<String>, List<String>, List<String>>() { 
       @Override 
       public List<String> call(List<String> a1, List<String> a2) { 
        List<String> list = new ArrayList<>(); 
        list.addAll(a1); 
        list.addAll(a2); 
        return list; 
       } 
      }) 
      .subscribe(
        (string)-> System.out.println(string) 
      ); 
+0

मुझे आपके द्वारा पोस्ट किए गए इस पर फ्लैटमैप जोड़ना पड़ा (मेरा प्रश्न संपादित किया गया)। – krisk

0
Observable<List<String>> query1(){ 
     List<String> s = new ArrayList<>(); 
     s.add("1");s.add("1");s.add("1"); 
     return Observable.just(s); 
    } 
    Observable<List<String>> query2(){ 
     List<String> s = new ArrayList<>(); 
     s.add("1");s.add("1");s.add("1"); 
     return Observable.just(s); 
    } 
    void HelloRx(){ 
     Map<String,String> map2=new LinkedHashMap<>();//pick the result you want to return Here ! 
     Observable.zip(query1(),//Observable Method 1 
       query2(),//Observable Method 2 
       (result1,result2)->{ 
        for(String s : result1){//result1 is the value returned by query1 , result2 ...u know. 
         //do whatever you want 
         //map.put(......) 
        } 
        return null; 
       }) 
       .subscribeOn(BackgroundSchedulers.getMultiThreadInstance()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .doOnCompleted(() -> { 
        //Do Something when finish for example transmit data to your adapter 
       }) 
       .subscribe(); 
    } 
0

जाहिर है एक सूची में दो सूचियों में शामिल होने के लिए, आप उनके Observable.from() रों पर Observable.concat() कर सकते हैं और फिर Observable.toList() कहते हैं।

RealmResults<Cat> equalTo; 
RealmResults<Cat> beginsWith; 

@Override 
public void onViewRestored() { 
    compositeSubscription = new CompositeSubscription(); 
    equalTo = realm.where(Cat.class).equalTo("field", filterString).findAllSorted("field"); 
    beginsWith = realm.where(Cat.class).beginsWith("field", filterString).findAllSorted("field"); 
    compositeSubscription.add(realm.asObservable() 
      .switchMap(new Func1<Realm, Observable<Cat>>() { 
       @Override 
       public Observable<Cat> call(Realm realm) { 
        return Observable.concat(Observable.from(equalTo), Observable.from(beginsWith)); 
       } 
      }) 
      .toList() 
      .subscribe(cats -> { 
       // update adapter with List<Cat> 
      })); 
संबंधित मुद्दे