2012-01-27 3 views
2

온라인 거래를위한 데이터를 수집하는 활동이 있습니다. 컬렉션이 완료되면 웹 서비스를 호출하고 응답을 기다리는 백그라운드 스레드 (특히 AsyncTask)를 실행 한 다음이를 활동으로 리턴합니다. 한편, 진행 대화 상자가 나타납니다.Android 백그라운드 스레드 관리 및 활동주기

응용 프로그램이 완료되거나 사용자가 취소하더라도 (웹 서비스에 계속 알릴 필요가 있음) 백그라운드 프로세스가 취소되도록하고 구성 변경으로 인해 작업이 손상된 경우 그대로 유지합니다. 또는 기억. onRetainNonConfigurationInstance()를 사용하여 AsyncTask에서 내 액티비티를 분리하고 유지 한 후 다음 액티비티에 다시 연결하려면 이미 인프라가 있습니다. 또한 일부 라이프 사이클 콜백에서 isFinishing 메소드가 내 앱이 정상적으로 종료되는지 알려줍니다. 진행 대화 상자의 콜백에서 사용자 취소를 처리 할 수 ​​있다고 생각합니다.

나는 두 가지 간단한 질문 한 내 활동 이 메모리 부족으로 인해 사망하는 경우()를

  1. 윌 onRetainNonConfigurationInstance를 호출? (그 이유가 구성 변경 인 경우 알 수 있습니다.)

  2. onStop() 및 onDestroy()가 호출되지 않는 상황은 무엇입니까 (개발자 가이드에서 강조한대로)? (필자는 취소 처리 내 코드는 항상 실행하면 것인지 알고 싶습니다.)

모두 모두, 나는 확신 할 수 onRetainNonConfigurationInstance()와 isFinishing와들의 OnDestroy를()() 구현하여 모든에 체크하는 것이 상황, 내 배경 스레드가 그에 따라 처리됩니까?

보너스 질문 : 내 애플리케이션이 어떤 이유로 강제 종료되는 경우 (영구적으로 말하면), 비동기 태스크가 응답을 저장하는 방법을 어떻게 제공 할 수 있습니까? 공유 환경 설정의 인스턴스를 유지하고 그 안에 데이터를 쓸 수 있습니까?

답변

3

메모리가 부족하여 내 활동이 중단 된 경우에도 onRetainNonConfigurationInstance()가 호출됩니까?

아니요. 귀하의 활동은 메모리 부족으로 인해 개별적으로 죽지 않습니다. 메모리가 부족하여 전체 프로세스가 종료 될 수 있지만 onRetainNonConfigurationInstance()은 프로세스 내에서만 사용하도록 설계되었습니다.

onStop() 및 onDestroy()가 호출되지 않는 상황 (개발자 가이드에서 강조한 것처럼)은 무엇입니까?

프로세스는 (onStop() 여전히 호출 할 가능성이 매우 높다하지만, 안드로이드 등으로 인해 수신 전화에 관해서는, 서둘러 경우 onDestroy()이되지 않을 수도 있습니다)으로 인해 메모리 부족 상태에 종료 될 수 있습니다. 또한 처리되지 않은 예외로 인해 앱이 중단 될 수 있습니다. 나는 사용자가 강제로 당신을 멈추게한다면 onDestroy()이 호출된다고 확신하지는 않지만 의심 스럽다.

모두 모두, 나는 onRetainNonConfigurationInstance()와 isFinishing와들의 OnDestroy를()() 구현하여, 모든 상황에서, 내 백그라운드 스레드가 따라 처리됩니다 확인할 것을 확신 할 수 있습니까?

"Every"은 강한 단어입니다. Android가 프로세스를 종료하면 스레드도 사라집니다.

내 응용 프로그램이 어떤 이유로 종료되면 (영구적으로 말하면), 비동기 태스크가 응답을 저장하는 방법을 제공하려면 어떻게해야합니까?

다른 작업을 수행하기 전에 디스크에 데이터를 쓰고 그 시점 이전에 죽지 않았 으면합니다. 그런 다음 다음 번에 실행하면이 저장된 데이터가 주변에 떠 다니고 나머지 작업을 수행하도록 조정됩니다.

+0

탁신, 나는 당신이 응답하는 사람이 되길 바랬습니다! 그래서 메모리 부족으로 프로세스가 종료 될 때 isCancelled()가 감지 될 때마다 다른 웹 서비스 호출을 할 기회가 없으며 데이터를 쓸 충분한 시간을 가지기를 바랄뿐입니다 (여전히 공유 환경 설정을 사용할 수 있습니까? 이것을 위해 또는 또한 파괴되고 그래서 이렇게 충고되지 않았습니까?). finish를 호출하기 전에 백그라운드 스레드를 취소 할 수 있다고 생각합니다. onReatinNonConfigurationInstance()는 구성 변경을 처리하기에 충분합니다. – Vincent

+0

@Vincent : "이것에 대한 공유 환경 설정을 사용할 수 있습니까? 아니면 파괴되어서 알려지지 않았습니까?" -'SharedPreferences'의 값은 앱이 제거 될 때까지 "파기"되지 않습니다. 즉,'SharedPreferences'는 다른 종류의 파일을 사용하는 것보다 점점 더 나아졌습니다. 다른 것들을 위해 데이터베이스를 사용하고 있다면, 나는 거래 정보이기 때문에 거기에 정보를 저장하는 것을 고려할 것입니다. – CommonsWare

+0

저장소를 의미하는 것이 아니라 개체를 작성하는 데 사용해야하는 개체입니다. 내가 추측 할 수있는 한, 현재 응용 프로그램과 연결되어 있습니다. 나는 아주 적은 양의 임시 데이터 만 저장되기 때문에 아직 데이터베이스를 사용하지 않습니다. 그러나, 나는 생각, transactonality 꽤 좋은 소리를 고려할 것입니다. 답변 해 주셔서 감사합니다. – Vincent