2014-10-04 8 views
6

10 분마다 반복적으로 프로세스를 실행하는 Android 앱을 만들려고합니다. 내가 발견 한대로 Handlers은 타이머 또는 예약보다 더 안정적입니다. 그래서 아래 주어진 코드를 사용하여 Handlers을 사용하여 앱을 개발할 것입니다.반복 작업을위한 Android Handler - 중복 될까요? Timer-task VS handler VS alarm-manager

나는 아래 코드가 onCreateHandler을 생성 할 때부터 앱을 시작하고 평행하게 유지할 때마다 별도의 Handlers을 만들지 않을까 걱정합니다.

그럼 한 번에 하나의 백그라운드에서 실행되는 단일 Handler 만 유지하는 가장 좋은 방법은 무엇입니까?

private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); // new handler 
    handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
    setContentView(R.layout.activity_pro__sms); 
} 

private Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     /* my set of codes for repeated work */ 
     foobar(); 
     handler.postDelayed(this, 1000*60*10); // reschedule the handler 
    } 
}; 
+0

궁금한 점 : '반복 작업'의 배경은 무엇입니까? 또는 아마도 더 나은 말했다 : 어떤 종류의 앱인가? 사용자가 한 번에 10 분 이상 앱을 적극적으로 사용한다고 생각하는 것은 관대 한 가정 일 수 있습니다 (게임이나 그렇지 않은 경우가 아니면 내 질문). 앱이 포어 그라운드에 있지 않은 상태에서'Handler'를 사용하면 올바른 행동을 취할 수 없습니다. –

+0

왜 서비스를 사용하지 않습니까? –

+0

수면 모드에서도 작업을 놓치지 않아도됩니다. 유휴 (절전) 모드에서도 서비스가 활성화 될 수 있습니까? 아니면 잠자기 잠금 장치가 있어야합니까? AlarmManager와 비교하여 서비스 별 리소스 사용량은 어떻습니까 (이제 알람 관리자로 문제를 해결하려고합니다). –

답변

4

나는 올바른 방법으로 알아 낸 이후로 내 자신의 질문에 대답하기로 결정했습니다. 안드로이드 방식. 무엇보다도 먼저 내가 뭘하려고했는지 질문에 게시하는 것은 제 요구 사항에 대한 잘못된 접근입니다. 이제는 다른 사람이 잘못하지는 않지만 다음과 같은 방법으로 게시 할 예정입니다.

Android에는 타이밍을위한 옵션이 거의 없습니다.

  1. 응용 프로그램이 실행되는 동안 타이머 작업이 실행됩니다. 단기적인 타이밍에 가장 적합합니다. 리소스 사용량이 더 높습니다.

  2. 응용 프로그램이 실행되는 동안 처리기가 실행됩니다. 그러나 스케줄러로 사용하기에는 적합하지 않습니다. (이것은 내가 뭘 물어 봤고 올바른 방법이 아닙니다.) Handlers은 앱이 죽을 때까지 반복적으로 작업을 수행하는 가장 좋은 방법입니다.

  3. Alarm-manager -> 앱이 종료 되더라도 나중에 어떤 일이 발생하도록 예약하는 가장 좋은 방법입니다. (이것은 내 응용 프로그램에 적용해야하는 것입니다).

이것은 내가 알아 낸 것입니다. 틀 렸으면 고쳐줘.

+4

이것은 틀 렸습니다. 핸들러는 응용 프로그램 스레드에서 작업을 간단히 예약합니다. 응용 프로그램이 종료되면 처리기 작업이 종료됩니다. –

+0

그래서 "postDelayed (Runnable, long)"메소드를 호출 할 때 어떤 일이 발생합니다. 실행 스레드를 트리거 할 수 있도록 앱 스레드를 활성 상태로 유지합니까? –

+2

아니요! 지연된 이벤트는 단순히 발생하지 않습니다. –

3

응용 프로그램 클래스를 확장하여 작업 할 수 있습니다.

public class App extends Application { 

    private Handler handler; 

    @Override 
    protected void onCreate() { 
     super.onCreate(); 
     handler = new Handler(); // new handler 
     handler.postDelayed(runnable, 1000*60*10); // 10 mins int. 
     setContentView(R.layout.activity_pro__sms); 
    } 

    private Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      /* my set of codes for repeated work */ 
      foobar(); 
      handler.postDelayed(this, 1000*60*10); // reschedule the handler 
     } 
    }; 
} 

그리고 매니페스트에 클래스를 선언 :

<application android:name=".App"> 

편집

그러나 앱이 실행중인 경우에만 작동합니다, 그렇지 않으면 당신은 AlarmManager를 사용할 수 있습니다.

+0

감사합니다. 나는 그것에게 시도를주고, 분 이내에 되돌아 간다. –

+0

실제로 내가 원하는 것은 다중 처리기가 생성되는 것을 방지하는 것입니다. 안드로이드 개발자 사이트에서 핸들러가 가장 적합한 방법이라고하는 방법이 있어야합니다. –

+2

Vang이 당신에게 준 것은 하나의 핸들러 만 생성하고 경과 된 시간을 기준으로 프로세스를 반복합니다. 그는 응용 프로그램 클래스를 확장하고 있습니다. 응용 프로그램 클래스는 한 번만 호출됩니다. 즉, 응용 프로그램을 만들 때 (응용 프로그램을 시작할 때) 호출됩니다. 응용 프로그램을 완전히 파괴하면 처리기가 작동을 멈추고 그렇지 않으면 한 번에 하나만 실행됩니다. 끊임없이 실행되는 핸들러를 찾고 있다면 위에서 언급 한 것처럼 AlarmManager를 사용하십시오. – NightwareSystems