2015-12-21 3 views
1

Мне нужно использовать устаревшую библиотеку, которая использует AsyncTask для задания фона. Как я могу обернуть AsyncTask объектом Observable, который я использую в своем текущем проекте.Обернуть наследие AsyncTask наблюдаемым Rxjava?

AsyncTask инкапсулирован, поэтому я не могу получить доступ к синхронному вызову внутри AsyncTask.

Спасибо, продвинутый!

+0

жаль спрашивать, как вы пытаетесь реализовать это? – Sree

+0

Как вы называете эту библиотеку? Если эта библиотека имеет любую синхронную функцию вызова, вы можете легко преобразовать ее в объект Observable. –

+0

Спасибо за ваши вопросы. Библиотека предоставляет AsyncTask и требует прослушивателя для обработки обратного вызова. Синхронный вызов находится внутри AsyncTask, поэтому я не могу получить доступ к нему для наблюдения. –

ответ

2

говорит, у вас есть объект asynchronousCall выполняющихся некоторые асинхронная работу с вызова() метода, который принимает обратный вызов как пары, вы можете обернуть его так:

Observable.create(new Observable.OnSubscribe<Object>() { 
     @Override 
     public void call(final Subscriber<? super Object> subscriber) { 
      asynchronousCall.call(new CallBack() { 
       @Override 
       public void success(Object o) { 
        subscriber.onNext(o); 
        subscriber.onCompleted(); 
       } 

       @Override 
       public void error(Throwable t) { 
        subscriber.onError(t); 
       } 
      }); 
     } 
    }); 
+0

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

+0

В этом примере asynchronousCall.call() также асинхронен, поэтому он принимает обратный вызов как параметр, можете ли вы представить краткий пример того, как вы используете этот api сейчас? – krp

+0

Большое вам спасибо. Ты сделал мой день. Извините, что не читал ваш ответ тщательно. –

1

Другого подход к случаю, когда вы не можете или не хотите, чтобы обернуть выполнение в Observable является использование Subjects:

public static void main(String[] args) { 
    Subject<Object, Object> subject = PublishSubject.create(); 

    Listener listener = new Listener() { 
     @Override 
     public void onCallback(Object object) { 
      subject.onNext(object); 
      subject.onCompleted(); 
     } 
    }; 
    subject.subscribe(object -> yourReaction(object)); 
    someMethodWithCallback(listener); 
} 

public interface Listener { 

    void onCallback(Object object); 

} 

Subject быть n Observer позволяет вам отправлять в него предметы, а Observable позволяет подписаться на него и получать эти события.

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