2011-12-20 2 views
0

webservice에서 반환 한 값에 따라 Android 애플리케이션이 있습니다. 이 값은 일주일에 한 번만 변경됩니다. 클라이언트는이 변경된 값을 감지해야하지만,이 변경을 감지 한 정확한 시간은 실제로 중요하지 않습니다. 12 시간에서 24 시간 후에 문제가 없어야합니다.Android 맞춤 애플리케이션 클래스 onCreate() 메소드에서 수행 된 작업을 예약해야합니까?

현재 구현은 webservice에서 값을 가져 오는 내 사용자 지정 응용 프로그램 클래스의 onCreate() 메서드에서 IntentService를 시작합니다. 또한 SharedPreferences에서 마지막으로 검색 한 값을 유지하므로 응용 프로그램에서이 값을 검색 할 때까지 기다릴 필요가 없습니다.

이제 내 질문은 onCreate() 메서드에서 처음 검색 한 후이 값의 검색을 예약해야하는 경우입니다. 12 시간 후에 말하도록 할 수 있습니다. onCreate() 메서드는 응용 프로그램의 수명주기에 한 번만 호출된다는 것을 알고 있지만, 응용 프로그램이 Android 시스템에서 종료 될 가능성이 얼마나 높을 지 모르겠습니다. 스케줄링이 필요하지 않도록 응용 프로그램이 충분히 종료 될 것이라고 가정하는 것이 합리적입니까? 그리고 수술을 예약해야하는 경우,이를 달성하는 가장 좋은 방법은 무엇입니까?

+0

onCreate를 사용했다면 두 번째로 호출 할 것이라고는 확신하지 못합니다. 예 : 사용자가 충전을 위해 휴대 전화를 연결하면 수면 모드가 해제되고 앱이 며칠 동안 계속 실행됩니다. 매우 희박하지만 불가능하지는 않습니다. 내가 너라면 내가 일종의 예정된 일을 정했다. 아마이 링크가 도움이 될 것입니다 - http://developer.android.com/resources/articles/timed-ui-updates.html. –

+0

당신이 개요를 설명하는 시나리오가 내가이 질문을 한 이유이다. Handler와 link 된 article의 postDelayed() 메서드를 사용한 코드 예제가 나에게 좋을 것 같은데, 나는 또한 이것이 효율적인 솔루션이라고 생각한다. –

+0

링크 된 기사에 설명 된 솔루션을 구현할 것입니다. 이것을 당신 자신의 대답에 넣으면 나는 당신의 대답을 받아 들일 것입니다. 그렇지 않다면 나는 나중에 내 자신의 질문에 대답 할 것이다. –

답변

1

onCreate()을 사용한 경우 두 번째로 전화 할 것이라고는 확신하지 못합니다. 예 : 사용자가 충전을 위해 휴대 전화를 연결하면 수면 모드가 해제되고 앱이 며칠 동안 계속 실행됩니다. 매우 희박하지만 불가능하지는 않습니다.

내가 당신이라면 일종의 예정된 작업을 설정했습니다. 어쩌면이 링크는 도움이 될 것입니다

http://developer.android.com/resources/articles/timed-ui-updates.html

예는 작업을 취소하는 OnClickListener를 사용합니다.

OnClickListener mStopListener = new OnClickListener() { 
    public void onClick(View v) { 
     mHandler.removeCallbacks(mUpdateTimeTask); 
    } 
}; 

너는 어딘가에 onDestroy()에 넣고 싶을 것이다.

+0

이것을 구현 한 것은 매력처럼 작동합니다. 내 Application 클래스의 onTerminate() 메서드에서 handler.removeCallbacks()에 대한 호출을 배치했습니다. 그러나 응용 프로그램이 종료 된 경우 응용 프로그램의 주 스레드도 닫히고이 스레드 메시지 큐의 모든 게시 된 메시지도 제거된다는 사실을 알고 있기 때문에 이것이 실제로 필요하다고 생각하지 않습니다. –

+0

흠, 게시 된 메시지가 확실하지 않습니다. 가능한 경우 명시 적으로 제거 할 것입니다. 또한,'Application.onTerminate()'는 실행이 보장되지 않습니다. * 프로덕션 안드로이드 장치에서는 절대로 호출되지 않습니다 * - http://developer.android.com/reference/android/app/Application.html#onTerminate% 28 % 29. –

+0

아, 좋은 점은 onTerminate()입니다. 메시지를 제거하는 방법 : 루퍼가 종료되면 http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,%20long%29 메시지가 삭제됩니다. 프로세스가 종료되면 발생합니다. –

0

비슷한 디자인 과제가 있었기 때문에 몇 가지 옵션이 있습니다. 둘 다 장단점이 있습니다.

당신은 많은 애플 리케이션과 같은 시작 화면이 있고, 공유 환경 설정을 웹 요청을하고 업데이트 할 asyncTask 클래스를 사용할 수있는

옵션. 앱이 너무 오래 스플래시 화면에 멈추지 않도록 맞춤 시간 제한을 설정할 수 있습니다. 결과가 무엇이든, 업데이트했거나하지 않은 경우 sharedPreferences에로드 된 내용을로드하여 해당 실행시 앱 사용에 사용할 수 있습니다.

좋은 점은 앱이 시작될 때마다 데이터가 최신인지 여부에 상관없이 걱정하지 않아도됩니다. 성능 업데이트의 경우 sharedPref 값이 마지막으로 업데이트 된 시간 (예 : 12 시간 미만의 값)을 저장하여 웹 요청을 건너 뛸 수 있으므로 결과적으로 스플래시 화면이 빠르게 빠르게 이동합니다. 당신은 AlarmManager 통해 알람을 사용할 수

옵션 B, 이것은 불필요한 배터리 소모 될 서비스보다 훨씬 더 될 것입니다. "INTERVAL_DAY"일 간격 동안 열거 형조차있다. 알람이 트리거되면 브로드 캐스트 리시버는 웹 요청을하고 값을 가져 와서 저장하는 사용자 정의 코드를 실행합니다. 알람 반복이 단일 용도인지를 나타낼 수 있습니다.

희망이 있습니다.

편집 : 관련성을 고른 옵션 만 있습니다.

+0

내 앱이 스포츠 결과 만 표시하기 때문에 스플래시 화면을 사용하고 싶지 않아 사용자가 필요하지 않으면 기다릴 필요가 없습니다. 또한 옵션 A는 Paul Question이 내 질문에 대한 자신의 의견에서 설명한 시나리오를 처리하지 않습니다. 옵션 B는 제 문제를 다루기에 좋은 방법이지만, 제 생각에는 그것이 지나치게 복잡하다고 생각합니다. 하지만 어쨌든 입력 해 주셔서 감사합니다. –

관련 문제