2014-02-15 4 views
2

주기적으로 인터넷에서 업데이트를 가져 오는 서비스를 구현하고 싶습니다. 나는이 목적을 성취 할 수있는 몇 가지 방법이 있음을 압니다. 나는 그들 중 2 명을 열거 할 것이다. 보다 효율적이고 실제로 어떤 것이 더 일반적인지 말해주십시오. 미리 감사드립니다.안드로이드 - 주기적 서비스를위한 모범 사례

1. 무한 while (true) 루프를 별도의 스레드 내에서 구현 한 다음 서비스의 onStartCommand에서이 스레드를 실행하십시오. 의사 코드 :

class Updater extends Service { 
    ... 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while (true){ 

        // fetching update... 

        Thread.sleep(FOR_A_WHILE); 
       } 
      } 
     }).start(); 
    } 
    ... 
} 

2.Schedule AlarmManager 주기적으로 트리거 할

+0

가능한 중복 [백그라운드에서 Android 앱을 정기적으로 설문하는 가장 좋은 방법] (http://stackoverflow.com/questions/6052426/best-way-to-have-an-android-app- poll-periodic-in-the-background) – ntv1000

답변

5

는 별도의 스레드 내부 무한 동안 (사실) 루프를 구현하고 서비스의 onStartCommand에서이 스레드를 실행 가져 오는 업데이트를 IntentService.

더 나은 패턴 구현은 ScheduledExecutorService을 사용하는 것입니다.

방법은 두 가지 구현이 같은 일이 아니며, 그래서 당신은 사과와 오렌지를 비교하는

일반적인 무엇보다 효율적이고 실제로 무엇을 가르쳐주세요.

첫 번째 방법은 - Thread.sleep() 또는 ScheduledExecutorService를 사용하는지 여부 - 말한다 "프로세스가 실행되는 동안 모든 N 밀리 초를 을 뭔가를 할 장치가 깨어".

두 번째 방법은 "중지 할 때까지 내 프로세스의 상태에 관계없이 (그리고 장치가 잠자기 경우에도 선택적으로) N 밀리 초마다 작업을 수행하십시오"라고 말합니다.

따라서 프로세스가 실행 중일 때만 작업해야하는 경우 첫 번째 방법을 사용합니다. 다른 상황에서는 두 번째 방법을 사용합니다.

+0

응답 해 주셔서 감사합니다. 내 목적은 모든 시간이 실행중인 알람 시계 서비스처럼 실행중인 서비스를 구현하는 것입니다. 장치가 잠 들어 있습니다.이 조건을 사용하면 어떤 접근 방식이 도움이 될 수 있습니까? –

+0

@ABFORCE : 두 번째 선택 ('AlarmManager')만이 작동합니다. 따라서, 정의에 따르면, 작동하지 않을 접근법보다 낫다. – CommonsWare

+0

도움을 주셔서 감사합니다. 귀하의 답변은 저에게 매우 도움이되었습니다! –

2

두 가지 방법 모두 괜찮을 것입니다. 하지만 나는 오히려 두 번째 접근 방식을 사용할 것입니다. 왜냐하면 처음에는 서비스가 언젠가는 시스템에 의해 강제 종료 될 수 있기 때문입니다. 메모리가 부족한 로우 엔드 장치에 꼭 있어야합니다. 그 iupdate를 놓칠 것입니다, 그렇습니다. 나중에 메모리를 사용할 수있게 될 때 다시 트리거 될 것입니다. (서비스를 만들 때 반드시 확인해야합니다.)하지만 결국에는 정말로 중요한지 여부에 달려 있습니다. 무엇이든 건너 뛰십시오.

+0

감사합니다. 도움이되었습니다. –