2015-07-24 10 views
2

Я пытаюсь протянуть руку и RxAndroid. У меня есть адаптер синхронизации, запрашивающий службу A, чтобы получить список страниц (размер n). Для каждого элемента в Pages мне нужно сделать запрос, который генерирует другие строки (размер m). То есть для каждого элемента в Pages будет m Lines.I хочу объединить все n строк в 1 список размера m * n и перенести в db.Создание структуры дерева с использованием RxAndroid

Observable.create(new Observable.OnSubscribe<Page>(){ 
     @Override 
     public void call(Subscriber<? super Page> subscriber) { 

      ArrayList<Page> pages = Utility.getPagesFromServer(); 
      for (Page page : pages) { 
       subscriber.onNext(page); 
      } 
      subscriber.onCompleted(); 
     } 


    }).map(new Func1<Page, JSONResponse>() { 
     @Override 
     public JSONResponse call(Page page) { 

      return Utility.getJSONObjectContainingLines(page); 

     } 
    }).map(new Func1<JSONResponse, ArrayList<Line>>() { 
     @Override 
     public ArrayList<Line> call(JSONResponse jsonResponse) { 
      return getLines(jsonResponse.getJSONObject()); 
     } 
    }) 

Я получаю страницы с сервера, то карта и получать строки для каждой страницы с сервера, а затем я разобрать JSON и получить ArrayList линий. Я не уверен, как исходить отсюда. Теперь я хочу перебирать каждую строку, а не каждый ArrayList.

ответ

2

После последнего map() использования .flatMapIterable() и вы будете преобразовывать Observable<ArrayList<Line>> в Observable<Line> и onNext(Line l) перебирать его (или использовать forEach()):

Observable.defer(new Func0<Observable<Page>>() { 
     @Override 
     public Observable<Page> call() { 
      return Observable.from(Utility.getPagesFromServer()); 
     } 
    }) 
    .map(new Func1<Page, JSONResponse>() { 
     @Override 
     public JSONResponse call(Page page) { 
      return Utility.getJSONObjectContainingLines(page); 
     } 
    }) 
    .map(new Func1<JSONResponse, ArrayList<Line>>() { 
     @Override 
     public ArrayList<Line> call(JSONResponse jsonResponse) { 
      return getLines(jsonResponse.getJSONObject()); 
     } 
    }) 
    .flatMapIterable(new Func1<ArrayList<Line>, Iterable<Line>>() { 
     @Override 
     public Iterable<Line> call(ArrayList<Line> lines) { 
      return lines; 
     } 
    }) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Action1<Line>() { 
     @Override 
     public void call(Line line) { 
      //Do something with your line 
     } 
    }, new Action1<Throwable>() { 
     @Override 
     public void call(Throwable throwable) { 
      throwable.printStackTrace(); 
     } 
    }, new Action0() { 
     @Override 
     public void call() { 
      //on complete 
     } 
    }); 

Или с помощью Lambdas:

Observable.defer(() -> Observable.from(Utility.getPagesFromServer())) 
    .map(page -> Utility.getJSONObjectContainingLines(page)) 
    .map(jsonResponse -> getLines(jsonResponse.getJSONObject())) 
    .flatMapIterable(lines -> lines) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(line -> { 
     //Do something with your line 
    }, throwable -> throwable.printStackTrace(),() -> { 
     //on complete 
    }); 

UPDATE:
Я решил добавить некоторые ссылки:
Transforming-Observables
flatmap

Как вы можете видеть, чтобы превратить Observable<ArrayList<Line>> в Observable<Line> вы должны использовать оператор flatMapIterable()

+0

Спасибо большое. Также вы можете сказать мне, почему вместо Observable.create вы использовали defer вместо Observable.defer? – Abhik

+0

@ Абхик, пожалуйста. 'Utility.getPagesFromServer()' может занять много времени, потому что, скорее всего, он использует сетевые операции (я заключаю это из названия). Используя 'defer()' вы можете гарантировать, что эта операция не будет выполняться в основном потоке. Else, он будет выполнен в основном потоке, и, скорее всего, вы должны получить 'NetworkOnMainThreadException'. Используйте 'defer()', чтобы избежать этого – Alexander

+0

@Abhik, вы можете прочитать об этом здесь: http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/ – Alexander

Смежные вопросы