2014-09-10 6 views
1

http://square.github.io/retrofit/에서 비동기식으로 말하면 "관찰 가능한 요청은 비동기 적으로 구독되고 HTTP 요청을 실행 한 동일한 스레드에서 관찰됩니다"라는 구가 있습니다.RxJava Observable Threading with Retrofit

그래서이 경우 실제로 HTTP 요청을 실행할 스레드 : 주 스레드가 Observable getUserPhoto (@Path ("id") int id)를 호출한다고합시다. HTTP 요청을 실행하는 요청을 구독하는 주 스레드 또는 스레드일까요?

답변

1

설명서와 관련하여 요청을 실행하는 스레드가됩니다.

요청 결과가보기에서 변경된 경우 주 스레드에서 결과를 관찰 (소비)해야 할 수도 있습니다. 이 경우 관찰 대상에 가입하기 전에 observeOn 메서드에 대한 호출을 추가하십시오.

1

대답은 예입니다. 서비스를 사용하여 메소드를 실행할 때 observeOn 메소드를 사용하면 mainThread가 기회가있을 때 요청을 실행할 수있는 기회를 기다리는 "관찰자"가 생성됩니다.

그래서 먼저 .observeOn (AndroidSchedulers.mainThread())을 사용하여 주 스레드를 관찰 한 다음 원격 API에서 응답을 얻으면 실행될 작업 또는 콜백을 구독하십시오.

이이 예가 될 것이다

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

당신의 API 인터페이스에서이 주석을 사용 랬 :이 RxJava (물론 사용을 개조 한)을 확인 할 수 있습니다 자세한 내용은

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){} 

        } 
       }); 

link 안드로이드의 Handler (쓰레드를 처리하는 클래스)를 사용한다고 명시되어있다.

"O 스케줄링 스케줄러를 제공한다. 주어진 안드로이드 처리기 스레드에서, 특히 메인 UI 스레드에서 bservable. "

+0

설명해 주셔서 감사합니다. 응답이 관찰자에게 다시 도달 할 때 사용되는 스레드로 주 스레드를 지정할 수있는 방법을 잘 알고 있습니다. 그러나 명확히하고 싶었던 문구에서 기본적으로 스레드가 HTTP 요청을 실행하는 스레드를 사용할 것이라고합니다. 누가 HTTP 요청을 실제로 실행하는지 아직도 혼란 스럽습니다. – user2934804

+0

여러분의 환영합니다. 아마도 Android Handler가 실제로 어떻게 작동하는지 이해하는 것이 더 중요 할 것입니다. Android 설명서에서 검색하여 찾을 수 있습니다. 기본적으로 기본적으로 처리기는 대기열에 "작업"을 추가하므로 기본 UI 스레드에 기회가있을 때이 작업이 실행됩니다. Android의 Handler를 사용하여 Runnables를 구현할 수 있기 때문에 다른 스레드도 만들 수 있습니다. 안드로이드의 스레드 관리 프레임 워크의 일부인 Looper라는 객체를 사용합니다. – Jorch914

관련 문제