2015-12-21 61 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則允許您訂閱並接收這些事件。