Retrofit 1.9 с OkHttp 2.2 и перехватчиками

Я думал, что эти последние версии должны быть совместимы. Есть этот твит; https://twitter.com/JakeWharton/status/553066921675857922 и журнал изменений Retrofit 1.9 также упоминает об этом.

Однако, когда я пытаюсь это сделать:

        OkHttpClient httpClient = new OkHttpClient();
        httpClient.interceptors().add(new TokenExpiredInterceptor());

        mRestAdapter = new RestAdapter.Builder()
                .setEndpoint(API_ENDPOINT)
                .setClient(httpClient)
                .setLogLevel(BuildConfig.DEBUG ?
                        RestAdapter.LogLevel.FULL :
                        RestAdapter.LogLevel.NONE)
                .setRequestInterceptor(new AuthorizationInterceptor())
                .build();

Это все еще не работает. Метод setClient жалуется на несовместимый объект Client;

Error:(29, 21) error: no suitable method found for setClient(OkHttpClient)
method Builder.setClient(Client) is not applicable
(argument mismatch; OkHttpClient cannot be converted to Client)
method Builder.setClient(Provider) is not applicable
(argument mismatch; OkHttpClient cannot be converted to Provider)

Что мне не хватает? Я также вижу, что OkHttpClient не реализует клиентский интерфейс.

Я использую этот подход на данный момент; https://medium.com/@nullthemall/execute-retrofit-requests-directly-on-okhttp-2-2-7e919d87b64e

Я неправильно истолковал список изменений? Maye Retrofit 1.9 может использовать OkHttpClient 2.2, когда он находится в пути к классам, но интерфейс еще не адаптирован?


person dzan    schedule 10.01.2015    source источник


Ответы (1)


Вы передаете OkHttpClient в RestAdapter.Builder, который принимает Client реализации. Только OkHttpClient не относится к модернизации, если не используется в реализациях Client.

Вы должны передать OkHttpClient экземпляру OkClient, который реализует Client

.setClient(new OkClient(httpClient))

OkHttpClient httpClient = new OkHttpClient();
httpClient.interceptors().add(new TokenExpiredInterceptor());

mRestAdapter = new RestAdapter.Builder()
        .setEndpoint(API_ENDPOINT)
        .setClient(new OkClient(httpClient))
        .setLogLevel(BuildConfig.DEBUG ?
                RestAdapter.LogLevel.FULL :
                RestAdapter.LogLevel.NONE)
        .setRequestInterceptor(new AuthorizationInterceptor())
        .build();
person Nikola Despotoski    schedule 10.01.2015
comment
Спасибо! Не могу поверить, что я пропустил это :p - person dzan; 11.01.2015
comment
@UsmanAfzal Это не связано с вопросом, вам следует поискать, сталкивался ли кто-то с этой проблемой раньше, или задать свой вопрос. - person Nikola Despotoski; 15.04.2015