0

오늘은 그냥 우리 자신의 제이크 와튼에 의해 개조에 대한 몇 가지 연구를하고 있었다, 그래서 나는 ANR 예상이Android : Retrofit 콜백 성공 및 실패가 비동기 적으로 실행 되었습니까?

RetroClass.getClient().getSomeData(param, new Callback<Model>(){ 

@Override 
public void failure(...){/*blah*/} 

@Override 
public void success(Model response, Response notUsed) 
{ 
try 
{ 
    Thread.sleep(10000); 
} 
catch(Exception e){e.pST();} 
}}); 

같은 것을했지만 흐름이 잘를 실행하고, 제이크 와튼이 언급 post Does Retrofit make network calls on main thread? "답변에서 알 수 있듯이 두 번째 패턴 (마지막 인수는 콜백)을 사용하면 요청이 비동기 적으로 완료되지만 콜백은 기본 스레드에서 호출됩니다. 기본적으로 Retrofit은 이러한 요청에 대해 스레드 풀을 사용합니다 . "

콜백이 주 스레드에서 실행되는데, 여기에서 무슨 일이 일어 났습니까? 왜 Thread.sleep()이 ANR을 발생시키지 않는가? ...? 나는 당황 스럽다 ....

답변

2

기본적으로 Android 플랫폼의 경우 CallbackExecutorMainThreadExecutor입니다.

는 다음 기본 동작을받지 않습니다 자신을 설정하여 기본 CallbackExecutor를 오버라이드 (override)하는 경우이

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setExecutors(new MyHttpExecuter(), new MyCallbackExecutor()) { // watch out for this 
      .build() 

같은 것을 수행하여 RestAdapter을 만들 때 기본 구현을 무시하지 않는 확인 .

+0

그리고 거의 새 스레드를 만드는 것과 비슷합니까? 새로운 Thread (new (ThreadRunnable()))를 명시 적으로 호출하고 시작하는 대신 Executor를 사용하고 있습니다. – uLYsseus

+0

사실 내 대답은 귀하의 질문에 대한 해결책으로 보이지 않습니다. 기본 콜백을 오버라이드하지 않는 경우에는 MainThreadScheduler를 사용합니다. 즉, 콜백 'onSuccess'또는 'onFailure'내에서 차단이 수행되면 UI가 차단됩니다. 실제로 ANR을 얻지 않더라도 콜백이 실행되는 동안 UI가 블로킹 된 것을 확인할 수 있어야합니다. 또한 onSuccess 콜백에 중단 점을 넣고 IDE에서 실행중인 스레드를 살펴볼 수도 있습니다. –

+0

그리고 예! Executer 인터페이스는 스레드 사용, 스케줄링 등에 대한 세부 정보를 포함하여 각 작업이 어떻게 실행될 것인지에 대한 메커니즘에서 작업 제출을 분리하는 방법을 제공합니다. http://docs.oracle.com/javase/7/docs/api/java /util/concurrent/Executor.html –