2014-08-29 4 views
1

Я пишу клиент API в Android с помощью Дооснащение и такого рода кода получает повторяется много:Как я могу избежать повторения общей наблюдаемой конфигурации?

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 's немного больше информации об этом

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()) 
Смежные вопросы