2015-12-02 13 views
2

Только что начал возиться с RxJava, так что я новичок в нем.Преобразование обратных вызовов в RxJava Observables

У меня возник вопрос о правильном подходе или возможных решениях следующей проблемы. Я много искал в Google, но, похоже, я не нашел подходящих решений, просто общие идеи.

У меня есть класс, который выполняет некоторую работу и имеет собственный интерфейс, давайте назовите его AClass. Теперь есть BClass, который реализует вышеупомянутый интерфейс. На onActivityResult из BClass, если requestCode совпадает с кодом запроса мы предоставили, затем AClass называет aClassInstance.handleActivityResult (..) и делает некоторые вещи. Затем он возвращается с помощью интерфейса.

Как кто-то приблизится к этому с помощью наблюдений RxJava?

Мой только попробовать на данный момент превратить handleActivityResult (..) в и наблюдаемых затем реализовать ObserVer интерфейса и инстанцирование объекта подписки в перекрытой onActivityResult из BClass, который, видимо, a Активность. Но мне нужно проверить, является ли подписка нулевой или отписана до создания экземпляра, что, как следствие, создает подписку только один раз, а затем Observer перестает получать больше объектов.

Я также прочитал о RxBus реализации. Я не совсем уверен, что это будет хороший подход, потому что это немного меня смущает.

Большое спасибо за любые идеи, которые вы можете предоставить. :)

ответ

0

Я действительно не понимаю, чего вы действительно хотите, но постарайтесь помочь вам. Я прав? Ваш класс AClassInstance хочет узнать, когда произошло onActivityResult из BClass? Если все это так, вам не нужно реализовывать «Ainterface» обоими классами. Вам нужно только слушатель, когда «onActivityResult» будет случается:

import rx.Observable; 


public class ExampleObservers { 

    public static void main(String[] args) { 
    CallbackReceiver receiver = new CallbackReceiver(); 
    ActivityProducer activity = new ActivityProducer(); 
    activity.setListener(receiver); 
    activity.onActivityResult(444, 0); 
    } 
} 

class CallbackReceiver implements ActivityProducer.RequestCodeProducer { 

    @Override public void handleActivityResult(Observable<Integer> requestObservable) { 
    requestObservable.map(it -> { 
     System.out.println("here U can do some extra things with your " + it + " number ..."); 
     return it; 
    }).subscribe(res -> System.out.println("Hello requestCode = " + res)); 
    } 
} 

class ActivityProducer { 
    interface RequestCodeProducer { 
    void handleActivityResult(Observable<Integer> requestCode); 
    } 

    private RequestCodeProducer listener; 

    public void setListener(RequestCodeProducer listener) { 
    this.listener = listener; 
    } 

    /* 
    * . . . . . . .. .. . . . 
    * Your activity`s methods 
    * */ 

    public void onActivityResult(int requestCode, int resultCode/*, Intent data*/) { 
    //super.onActivityResult(); 
    Observable<Integer> observable = Observable.defer(() -> Observable.just(requestCode)); 

    if (listener != null) { 
     listener.handleActivityResult(observable); 
    } 
    } 
} 

Если вы запустите в IDE, вы увидите выход «Hello requestCode = 444». Итак, все работает нормально, и вы получаете свой обратный вызов.

+0

AClass определяет интерфейс, который должен реализовать BClass. Затем BClass вызывает aClassInstance.handleActivityResult() и AClass после выполнения некоторой работы, должен сообщать результаты обратно в BClass через этот интерфейс. Это что-то, что может быть заменено RxJava или это интерфейсы, единственный путь вокруг него? – Pavlos

+0

Да, вы можете сделать это с RxJava, создавая что-то вроде горячих наблюдателей [хороший пример, но не в Java] (http://www.introtorx.com/content/v1.0.10621.0/14_HotAndColdObservables.html) И более удобный способ, я думаю - использовать RxBus. Проверьте этот [хороший пост] (http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/) Kaushik Gopal. Надеюсь, это поможет вам. –