2014-08-29 62 views
1

我在Android中使用改裝寫的API客戶端和這種代碼被重複了很多:如何避免重複常見的可觀察配置?

myObservableFromRetrofit 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .doOnError(... print stack trace ...) 

我想知道如果有一種技術來避免再次發生這類東西。

我周圍的呼叫與改造功能:

public Observable<?> commonObservable(Observable<?> observable) { 
    return observable 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .doOnError(... print stack trace ...) 
} 

但是,失去了泛型類型的信息。

回答

3

替代?替代T並添加缺少<T>。這將允許Type Inference正確完成。

public <T> Observable<T> commonObservable(Observable<T> observable) { 
    return observable 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .doOnError(... print stack trace ...) 
} 

這是通配符捕獲的問題。

大部分情況下,除非看到包含短語「capture of」的錯誤消息,否則不需要擔心通配符捕獲。

這我假設你指的。 Here關於它的更多信息

4

而不是包裝你的觀察物,你應該使用compose()運算符,詳見this blog post。所以,你必須:

<T> Transformer<T, T> applySchedulers() { 
    return observable -> observable.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .doOnError(... print stack trace ...) 
} 

,你會打電話來是這樣的:

myObservableFromRetrofit 
    .compose(applySchedulers()) 

或此,如果你編譯下面JDK 8:

myObservableFromRetrofit 
    .compose(this.<YourType>applySchedulers())