2016-04-23 34 views
0

我正在嘗試學習RxJava並進行翻新。所以這可能是一個簡單的問題。RxJava中的鉤子行​​爲Android和翻新

我想在改造api調用上編寫一個包裝方法。此方法將顯示並隱藏進度視圖,並在開始呼叫和完成呼叫之前執行其他操作。

這是我的服務方法

@GET("/books") 
    Observable<List<Book>> getBooks(); 

現在,在實際進行呼叫之前,我想顯示進度視圖。

public <T> void execute(Observable<T> observable, final RequestHandler<T> callback) { 
    observable = observable 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()); 

    progressDialog = new TransparentProgressDialog(context, progressViewColor); 
    progressDialog.setCancelable(false); 
    dismissProgressDialog(); 
    progressDialog.show(); 

    observable.subscribe(new Observer<T>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable t) { 

      ///Handle error 
     } 

     @Override 
     public void onNext(T t) { 
      /// Call the callback 
     } 
    }); 
} 

如在我傳遞的接口(RequestHandler),我的錯誤和onNext調用代碼可以看出。我能夠得到這個工作。但是這與普通的回調實現沒有區別。根據我的理解,觀察者應該是可鏈接的。但我不確定如何實現這一目標,以便觀察可以鏈接。

有人可以幫我嗎?

謝謝

回答

0

看了一些關於MVP模式。 創建一些將執行請求和處理響應的演示者。在此演示者內部創建BehaviourSubject,並根據您的需要使用所需的布爾值發出onNext值。

import retrofit.Callback; 
import retrofit.RetrofitError; 
import rx.Observable; 
import rx.subjects.BehaviorSubject; 
public class TestTest { 

    public final BehaviorSubject<Boolean> progressSubject = BehaviorSubject.create(true); 
    public final Observable<SomeResponse> responseObservable; 

    public TestTest(ApiService apiService) { 

     responseObservable = apiService.performRequest(new Callback<SomeResponse>() { 
      @Override 
      public void success(SomeResponse someResponse, retrofit.client.Response response) { 
       progressSubject.onNext(false); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       progressSubject.onNext(false); 
      } 
     }); 
    } 

    public Observable<Boolean> progressObservable() { 
     return progressSubject; 
    } 
} 

然後,在片段/活動訂閱progressObservable像

presenter.progressObservable() 
      .compose(this.<Boolean>bindToLifecycle()) 
      .subscribe(RxView.visibility(progressBar)); 

    presenter.someResponseObservable()... 

請注意,在上面的例子中,進步將是可見的,從一開始,因爲「真」是BehaviourSubject的初始值。請記住,您必須訂閱reponseObservable。沒有它,上面的代碼會導致無盡的進步。