1

아래 Google에서 제공하는 SyncService의 예는 IntentService 대신 Service을 사용하는 이유는 무엇입니까? 백그라운드에서 IntentServices이 실행되는 반면, Service은 기본 스레드에서 실행됩니다. 데이터를 업데이트하는 UI가없는 무언가를 위해, 왜 메인 스레드에서 실행하고 싶습니까? 그 위험이 프레임 하락하지 않니?IntentService를 통해 서비스를 사용하는 이유는 무엇입니까?

http://developer.android.com/training/sync-adapters/creating-sync-adapter.html#CreateSyncAdapterService

독립형 IntentService을 할 수 있습니까? 또는 기본 스레드에서 실행중인 것을 기반으로해야합니까? 이것이 우리가 위의 일반 Service을 사용하는 이유를 알 수있는 유일한 이유입니다.

답변

3

일반 서비스가 주 스레드에서 실행되는 동안 IntentServices는 백그라운드에서 실행됩니다.

개체가 스레드에서 실행되지 않습니다. 메소드가 수행합니다.

IntentServiceService에서 상속됩니다. 기본 응용 프로그램 스레드에서 Service의 주 라이프 사이클 메소드, 특히 onStartCommand()이 호출됩니다. IntentService은 을 호출하여 사용자의 onHandleIntent() 메서드를 호출하는 데 사용하는 백그라운드 스레드를 제공합니다.

데이터를 업데이트하는 UI가 없는데 왜 메인 스레드에서 실행하고 싶습니까?

그렇지 않습니다.

Google에서 제공하는 SyncService 예제가 IntentService 대신 서비스를 사용하는 이유는 무엇입니까?

여기서 IntentService은 부적절합니다. 연결된 문서 인용하기 :

이렇게하려면 동기화 어댑터 구성 요소에서 프레임 워크로 특수 Android 바인더 개체를 전달하는 바인딩 된 서비스를 만들어야합니다. 이 바인더 객체를 사용하면 프레임 워크에서 onPerformSync() 메서드를 호출하고 데이터를 전달할 수 있습니다.

IntentService이며, 결합 패턴이 잘 맞지 않는다.

안드로이드가 제공하는 스레딩 관점에서 onPerformSync() is called on a background thread. 따라서 IntentService이 바인딩을 기준으로 제외되지 않은 경우에도 onPerformSync()이 이미 백그라운드 스레드에서 호출되었으므로 다른 백그라운드 스레드가 필요하지 않습니다.

+0

감사합니다. 내 문제는 내가 (사용자의 현재 위치를 얻기 위해) 내 서비스의 onCreate() 메소드에서 LocationListener를 작성 중이므로 SyncAdapter의 onPerformSync()가 호출 될 때 - 업데이트 된 위치를 사용하고 있기 때문이다. 내 LocationListener (네트워크 공급자를 사용하고 사용자의 현재 위치 만 한 번만 가져옵니다)를 어디에 만들어야하는지 더 잘 알고 있습니까? – ZakTaccardi

+0

@ user891242 : IMHO, 사용자의 위치를 ​​얻는 것은 서버와 동기화하는 것과는 아무런 관련이 없습니다 ('SyncAdapter'의 요점). – CommonsWare

+0

글쎄, 내 날씨 애플 리케이션, 나는 사용자가 날씨 데이터에 대한 자신의 현재 위치를 사용할 수있는 CheckboxPreference 있습니다. 확인란을 선택하면 SyncAdapter가 새 위치를 사용하여 즉시 동기화되기를 원합니다. 귀하의 조언에 따라 IntentService를 사용하여 비동기 적으로 새 위치를 가져온 다음 새 위치를 검색 할 때 SyncAdapter 서비스를 호출합니다. – ZakTaccardi

관련 문제