2012-12-19 5 views
8

저는 작업 목록을 쓰고 있고 모든 작업 (및 메타 데이터)을 보유하고있는 Project 개체가 있습니다. 작업 로그를 사용하므로 작업이 변경되면 즉시 데이터베이스에 저장하지 않고 메모리에 보관하여 작업 완료시 데이터베이스에 덤프합니다. 액티비티의 onDestroy 메서드는 이것에 가장 적합한 위치입니다. onRetainNonConfigurationInstance 메서드가 호출되지 않은 경우 프로젝트 저장을 시작합니다 (인스턴스가 Application에 저장 됨). 절약은 비쌉니다 : DB 프로젝트에서 개정판이 있으므로 새 데이터를 저장하고 현재 개정을 변경하며 이전 개정의 데이터를 삭제합니다. 그래서 나는 suddent application stop을 두려워하지 않는다. to documentation을 aсcording데이터를 액티비티의 onDestroy 메서드에 저장하십시오.

하지만, 내가해야 do not count on this method being called as a place for saving data.

내 데이터를 저장하기위한 어떤 다른 곳이 있습니까?

답변

17

항상 OnDestroy가 호출되지는 않습니다. 라이프 사이클 문서에서 -

활동이 중지시() 메서드 호출을 수신

, 그것은 더 이상 표시이고있는 거의 모든 자원을 해제해야하지 사용자가이를 사용하지 않는 동안 필요로했다. 활동이 중지되면 시스템은 시스템 메모리를 복구해야하는 경우 인스턴스를 파괴 할 수 있습니다. 극단적 인 경우 시스템에서 활동의 최종 onDestroy() 콜백을 호출하지 않고 앱 프로세스를 종료 할 수 있으므로 onStop()을 사용하여 메모리가 누출 될 수있는 리소스를 해제하는 것이 중요합니다. onPause() 메서드가 이동 중지() 전에 호출되어 있지만

, 당신은 예 : 데이터베이스

에 정보를 기록으로 더 큰, 더 많은 CPU 집중적 인 셧다운 작업을 수행하는) (중지시 사용한다 Stop Your Activity

+0

그래서 대체 무엇입니까? .. –

+0

'OnStop()'에 데이터를 저장하십시오. 항상 부름을받을 것입니다. – iagreen

+0

onStop은 onRetainNonConfigurationInstance를 호출하기 때문에 작업이 완료되었는지 또는 방금 오리엔테이션이 변경되었는지는 알 수 없습니다. –

3

당신은 또한 onPause를 사용할 수 onStop

Activity docs

를 사용한다, 그러나 당신이 멀리 Activity에서 탐색 할 때마다이이 화면을 해제 포함, 호출됩니다.

+0

onStop onRetainNonConfigurationInstance가 호출되기 전에 호출되므로 작업이 완료되었는지 또는 방금 오리엔테이션 변경인지 알 수 없습니다. –

+1

나는 활동이 실행되는 동안 데이터베이스에 쓰지 않는 이유를 완전히 이해하지 못한다 ... 별도의 스레드에서 수행 할 수 있고 로더 API를 사용하여 동기화가 완료되었는지 확인할 수있다. 나에게 더 좋은 디자인 패턴. 당신의 방식대로, 당신은 항상 사람들이 전화기를 끄거나 공격적으로 메모리를 회수하는 OS를 위험에 빠뜨릴 수 있습니다. –

+0

조치 로깅을 사용하므로 suddent 앱 종료가 문제가되지 않습니다. 내가 활동을 실행하는 동안 나는 일부 타이머를 사용하고 데이터를 일시적으로 저장할 것입니다. –

4

데이터 저장 방법으로는 onDestroy()을 사용하지 마십시오. 대신 내부/외부 저장 공간을 사용하거나 onPause() 방법으로 코드를 작성해야합니다.

+1

onPause는 매우 자주 호출 될 수 있으며 저장 프로세스가 효과적입니다. –

2

Activity Lifecycle documentation에 따르면 데이터를 onPause() 또는 onSaveInstanceState(Bundle)에 저장해야합니다.

onDestroy()onStop()은 작업이 종료되기 전에 절대로 호출되지 않을 수 있습니다.

발췌 Activity Lifecycle documentation에서 :

보호 무효 들의 OnDestroy()

참고 :이 방법에 포함되지 않습니다 데이터를 저장하기위한 장소로 호출되는!활동이 콘텐츠 제공 업체에서 데이터를 편집하는 경우 예를 들어, 그 편집은하지 여기onPause()또는 onSaveInstanceState(Bundle), 하나에 최선을 다하고해야합니다.

보호 시스템이 onPause 후 실행 활동의 과정을 유지하는 메모리가 충분하지 않습니다이 방법은 메모리 부족 상황에서, 호출되지 않을 수 있음을 무효 이동 중지()

주() 메서드가 호출됩니다.

관련 문제