2015-12-21 62 views
1

我必须使用使用AsyncTask进行后台工作的遗留库。如何通过我当前项目中使用的Observable对象来包装AsyncTask。由Observable Rxjava包装遗留的AsyncTask?

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是一个您可以使用Observer向其发送项目,而使用Observable则允许您订阅并接收这些事件。