2016-09-19 2 views
0

У меня есть пользовательский класс, назовите его Builder. Он имеет метод act(), который выполняет асинхронную операцию. Когда операция будет выполнена, я хочу испустить событие.RxJava: Смотреть пользовательский класс

Как это сделать в RxJava?

Похоже, что это простая задача, но мне еще предстоит увидеть правильный способ RxJava.

Более подробно, типичный act() метод выглядит так:

class Builder 
     public void act() { 
      processRunner.runAsync(new ProcessRunner.ProcessResultHandler(){ 
       @Override 
       public void onComplete(int result) { 
        // Emit event 
       } 
      }); 
     } 

И что я хочу в классе потребляющего, чтобы позвонить:

builder.act() 

и как-то быть предупреждены, когда onComplete() называется.


Я также контролировать ProcessRunner, так что я хотел бы преобразовать, что RxJava и цепочки результатов, но сейчас я возьму простую USECASE!

ответ

1

Это возможно, используя PublishSubject в RxJava. Позвольте мне объяснить вам, как вы можете использовать его в своем застройщике. Создайте класс, как показано ниже:

public class Communicator { 
    private static Communicator mCommunicator = new Communicator(); 
    private PublishSubject<Void> mGrabEvent = new PublishSubjetct.create(); 
    private Communicator(){ 
    } 
    public static getCommunicator(){ 
    return mCommunicator 
    } 
    public static emitEventItem(){ 
    // you can pass any object that you want to listen 
    mGrabEvent.onNext(null); 
    } 
public PublishSubject<Void> subscribeEvent(){ 
    return mGrabEvent; 
} 
} 

Этот класс поможет вам излучать & подписаться его для прослушивания конкретного события в любом месте в вашем приложении. Ниже я пытаюсь показать вам, как испускать и подключать этого слушателя к вам, активности или фрагмента.

A. Для испускать сообщения с вашего строителя класса

class Builder{ 
    public void act() { 
    processRunner.runAsync(new ProcessRunner.ProcessResultHandler(){ 
     @Override 
     public void onComplete(int result) { 
     // Emit event 
     Communicatort.getCommunicator().emitEventItem(); 
     } 
    }); 
    } 
    } 

B. Другой конечной точкой, где вы бы слушать ее, подписавшись его.

Communicatort.getCommunicator().subscribeEvent().subscribe(new Action<Void>(){ 
    @overrider 
    public void call(Void void){ 
    } 
}); 

C. В последнем случае убедитесь, что вы должны отказаться от подписки на него.

Я надеюсь, что это могло вам помочь. Дайте мне знать, если вы сможете понять в любой момент.

Спасибо, Bhavdip

+1

PublishSubject как я в конечном итоге делает это одно, но я положил его на самом Builder классе. Спасибо за дополнительную информацию, это выглядит как хороший подход! – mtyson

+0

Просто имейте в виду, что Субъекты являются «Горячими Наблюдателями», что означает, что он может излучать предметы, даже если никто не подписался на него. Например, ваш коммуникатор может начать испускать элементы, когда он не прослушивает его. –

+0

Это верно, но это может обрабатывать внутри класса коммуникатора. Вы можете проверить, подписаны ли они подписчиком или нет. –

1

Вам необходимо вернуть Observable<Boolean> из вашего метода act. Затем вы можете позвонить onCompleted по номеру Subscriber, который будет вашим классом потребления.

Код:

class Builder { 
    public Observable<Boolean> act() { 
     return Observable<Boolean>.create { 
     public void call(final Subscriber subscriber) { 
     processRunner.runAsync(new ProcessRunner.ProcessResultHandler(){ 
      @Override 
      public void onComplete(int result) { 
       subscriber.onNext(true); 
       subscriber.onCompleted(); 
      } 
     }); 
     } 
     } 
    } 
} 

Потребляя Класс:

 builder.act().subscribe({ 
     void onNext(boolean status) {} 
     void onCompleted() { // finished } 
     }) 

код не испытывалось. Могут быть синтаксические ошибки.

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

  • Нет связанных вопросов^_^