2014-01-08 6 views
25

Я пытаюсь изучить Retrofit + OkHttp на Android. Вот некоторые код, который я нашел в Интернете:Модернизация сети делает сетевые вызовы основной темой?

RestAdapter restAdapter = new RestAdapter.Builder().setExecutors(executor, executor) 
.setClient(new OkClient(okHttpClient)) 
.setServer("blah").toString()) 
.build(); 

Если я не использую исполнителю услуги, будет мой код быть запущен на главном потоке? Должен ли я делать веб-запросы в новом потоке?

+6

Прочитано «Синхронный против асинхронного или наблюдаемого» на http://square.github.io/retrofit/ –

ответ

16

Метод, возвращающий значение, выполняет его синхронно.

@GET("/user/{id}/asset") 
Asset getUserAsset(@Path("id") int id); 

Чтобы сделать это Асинхронное все, что вам нужно - это добавить обратный вызов.

@GET("/user/{id}/asset") 
void getUserAsset(@Path("id") int id, Callback<Asset> cb); 

Надеюсь, что это поможет.

С уважением!

+0

Спасибо, я просто хотел получить подтверждение, если Retrofit позаботится об управлении потоками, поскольку ваша библиотека предназначена для сети операции и операции с сетью должны выполняться на не-ui-потоке. – SlowAndSteady

+0

Почему бы вам просто не попробовать? Я думаю, что стоит просто запустить код, и сразу же вы заметите, что он обработан или нет в основном потоке. –

+2

Да, извините, что не ответил в своем последнем комментарии. Вызов выполняется по основному потоку. – SlowAndSteady

95

Методы дооснащения могут быть объявлены либо синхронно, либо асинхронно.

Метод с возвращаемым типом будет выполняться синхронно.

@GET("/user/{id}/photo") 
Photo getUserPhoto(@Path("id") int id); 

Асинхронное выполнение требует последний параметр метода является Callback.

@GET("/user/{id}/photo") 
void getUserPhoto(@Path("id") int id, Callback<Photo> cb); 

В Android обратные вызовы будут выполнены в основном потоке. Для настольных приложений обратные вызовы будут выполняться в том же потоке, который выполнял HTTP-запрос.

дооснащения также интегрирует RxJava для поддержки методов с типом возвращаемого rx.Observable

@GET("/user/{id}/photo") 
Observable<Photo> getUserPhoto(@Path("id") int id); 

наблюдаемых запросов подписными асинхронна и наблюдаемым в том же потоке, выполняющего запрос HTTP. Чтобы посмотреть на другой поток (например, основной поток Android), вызовите observeOn(Scheduler) по возвращенному Observable.

Примечание: Интеграция RxJava является экспериментальной.

+2

Спасибо за ответ, я задаюсь вопросом, почему он был занижен! В любом случае, мой вопрос заключался в том, выполняется ли сетевой код в отдельном потоке (или IntentService) за кулисами (например, Volley); или мне нужно написать код для этого самостоятельно. Ваш ответ нацелен на обработку ответа ... что опять полезно :) – SlowAndSteady

+10

Как сказано в ответе, если вы используете второй шаблон (последний аргумент как «Обратный звонок»), запрос выполняется асинхронно, но обратный вызов вызывается на основной нити. По умолчанию Retrofit использует пул потоков для этих запросов. –

+2

On Retrofit 2, я думаю, мы используем 'call.enqueue()' для получения ответа на асинхронный вызов.Мой вопрос заключается в том, как сделать вызов для другого Thread, вызывая метод getUserPhoto() выше из рабочего потока? –