2016-12-12 2 views
1

Я новичок в RxJava и нуждаюсь в некоторой помощи для выполнения моей задачи.RxJava: Возвратите наблюдение после некоторой задержки

1.

У меня есть служба, которая должна рисовать формы со скоростью один за второй и вернуть Observable с этой формой. Это означает, что метод shoud возвращает форму через одну секунду после запроса. Без задержки это работает. Мне сказали использовать таймеры, но у меня проблемы с реализацией.

Я пытался использовать что-то подобное, но не возвращает ничего:

public Observable<PaintedCircle> paint(Shape shape) { 
     return Observable 
       .timer(1, TimeUnit.SECONDS) 
       .flatMap(x -> Observable.just(new PaintedCircle(shape.getSize()))); 
    } 

Когда я делаю это без flatMap он возвращает объект немедленно.

2.

Мой продюсер создает список с некоторым количеством объектов формы (круги и квадраты). Мне нужно выбросить слишком маленькие круги, нарисовать фигуры (сервис, описанный в первом вопросе), а затем поместить фигуры в «ящики» - по 5 штук в каждую коробку в порядке, который они вернули с живописи. Затем все формы из каждой коробки должны быть напечатаны на консоль.

Вопрос: может ли это быть сделано в общем потоке? Как?

Я начал поток, как это, но нужно помочь идти дальше:

Producer producer = new Producer(); 
     Observable.from(producer.produceShapes(20)) 
       .filter(shape -> shape instanceof Square || shape instanceof Circle && shape.getSize() > CIRCLE_MIN_SIZE) 
       .flatMap(shape -> shape.getPaintingService().paint(shape)); 
//    .subscribe(System.out::print); 
    } 

ответ

2

Я не Shure, чтобы понять ваш первый вопрос, но если вы хотите, чтобы испустить значение каждый секунд, посмотрите на interval вместо этого: timer будет излучать один раз после первой секунды, затем завершить. intervale будет излучать каждый секунд (и будет никогда не полным, если вы не завершать ваш поток)

public Observable<PaintedCircle> paint(Shape shape) { 
    return Observable.interval(1, TimeUnit.SECONDS) 
        .map(x -> new PaintedCircle(shape.getSize()); 
} 

Пожалуйста, обратите внимание: в этом случае map может быть использован вместо flatMap

Что касается второго вопроса вы можете посмотреть на операторе buffer: вы можете буферные элементы в список из 5 элементов, например

Producer producer = new Producer(); 
    Observable.from(producer.produceShapes(20)) 
       .filter(shape -> shape instanceof Square || shape instanceof Circle && shape.getSize() > CIRCLE_MIN_SIZE) 
      .flatMap(shape -> shape.getPaintingService().paint(shape)); 
      .buffer(5) 
      // shapes will be a list of 5 shape 
      .map(shapes -> new Box(shapes)) 
      .subscribe(box -> { 
        System.out.println("BOX ---> " + box.getName()); 
        box.getShapes().foreach(System.out::println); 
      }); 
+0

спасибо, что вы помогли мне вторым вопросом много! О первом вопросе: я хочу, чтобы служба дала мне значение один раз после некоторой задержки (в этом случае - в одну секунду) –

+0

Это означает, что я прошу сервис из моего основного потока рисовать круг, и он должен вернуть меня через одну секунду. –

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