2014-09-10 2 views
1

В http://square.github.io/retrofit/, где говорится об асинхронной, есть фраза «Наблюдаемые запросы подписываются асинхронно и наблюдаются в том же потоке, который выполнял HTTP-запрос», где я хотел уточнить.Уточняющая резьба RxJava с прототипом

Итак, в этом случае поток, который фактически выполнит запрос Http: Позволяет сказать, что основной поток вызывает вызов Observable getUserPhoto (@Path («id») int id)? Будет ли основной поток или поток подписываться на запрос, выполняющий HTTP-запрос?

ответ

1

В отношении документации это будет поток, который выполняет запрос.

Если результат вашего запроса изменит что-то в представлении, вам может потребоваться наблюдать (потреблять) результат в основной теме. В этом случае добавьте вызов метода observOn, прежде чем подписываться на ваш наблюдаемый.

1

Ответ да, когда вы выполняете свой метод с помощью службы, метод randomOn создаст «Наблюдатель», который будет ждать возможности выполнить запрос, как только mainThread сможет это сделать.

Итак, сначала используйте .observeOn (AndroidSchedulers.mainThread()), чтобы наблюдать за основным потоком, а затем подписаться на действие или обратный вызов, который будет выполняться после получения ответа от удаленного API.

предположив использовать эту аннотацию в интерфейсе API

@GET("/home") 
Observable<Response> getHome(); 

это будет пример:

service.getHome().observeOn(AndroidSchedulers.mainThread()).subscribe(
       new Action1<Response>() { 
        @Override 
        public void call(Response response) { 
         System.out.println("Response home"); 
         System.out.println(response.getStatus()); 
         System.out.println(response.getBody().mimeType()); 
         System.out.println(response.getReason()); 
         System.out.println(response.getUrl()); 
         StringWriter w = new StringWriter(); 
         try{ 
          IOUtils.copy(response.getBody().in(),w,"UTF-8"); 
          System.out.println(w.toString()); 
         }catch (IOException e){} 

        } 
       }); 

Для получения дополнительной информации вы можете проверить это RxJava (тот, который модернизации использует конечно) link, где указано, что он использует обработчик Android (который является классом для обработки потоков).

«Он предоставляет планировщик, который планирует Наблюдаемый на данной потоке обработчика Android, в частности, основной пользовательский интерфейс . "

+0

Спасибо за объяснение. Я понимаю, как мы можем указать основной поток как поток, который используется, когда ответ возвращается к наблюдателю. Однако из фразы, которую я хотел уточнить, по умолчанию говорится, что он будет использовать поток для выполнения HTTP-запроса. Я все еще запутался, кто действительно выполняет HTTP-запрос? – user2934804

+0

Ваше приветствие, чтобы разъяснить немного больше, возможно, более важно понять, как работают Android-обработчики. Это можно найти с помощью поиска в документации по Android. По существу, по умолчанию обработчик добавляет «задачу» в очередь, поэтому, когда основной поток пользовательского интерфейса имеет шанс, эта задача будет выполнена, как бы там ни было возможно создать другой поток, поскольку Runnables можно реализовать с помощью обработчика Android, а также использует объект Looper, который является частью платформы управления потоками Android. – Jorch914

Смежные вопросы