2012-07-23 2 views
2

내 앱에서 http 요청을하는 여러 개의 AsyncTask가 있습니다. 작업이 실패하면 사용자에게 DialogFragment를 표시합니다.DialogFragment로 인해 null 포인터 충돌이 발생했습니다.

ErrorDialogFragment newFragment = ErrorDialogFragment.newInstance(R.string.dialog_message_error); 
newFragment.show(getFragmentManager(), ConstantHandler.DIALOG_ERROR); 

문제는 사용자가 때때로 getFragmentManager에 널 포인터 예외를 발생, 완료 활동 또는 AsyncTask를하기 전에 응용 프로그램을 종료한다는 것입니다.

제 질문은 각 조각과 활동이 아직 실행 중인지 확인하는 것 외에는이를 피할 수있는 방법이 있다면 제 질문입니다.

답변

3

이전에 같은 문제가있었습니다. 어딘가에서 블로그에서 본 합리적으로 좋은 대답은 다음과 같습니다 (

).

AsyncTasks에 현재 컨텍스트에 대한 참조를 지정합니다. 응용 프로그램을 최소화/회전하면 onRetainNonConfigurationInstance()getLastNonConfigurationInstance()을 사용하여 AsyncTasks를 저장하십시오. 그런 다음 에 앱이 다시 시작되면 getLastNonConfigurationInstance()에서 다시 전달 된 AsyncTask가 있는지 확인할 수 있습니다. 있을 경우 컨텍스트를 활동의 새로운 컨텍스트로 설정하십시오. 이제 AsyncTask는 새 컨텍스트에 액세스하고 작업을 완료 할 수 있습니다.

철저히 살펴 보려면 onRetainNonConfigurationInstance()을 사용하여 저장하기 전에 AsyncTasks에서 컨텍스트를 null으로 설정하는 것이 좋습니다. 그런 다음 AsyncTask에서 컨텍스트가 무언가를 시도하기 전에 null인지 확인하십시오. AsyncTask가 백그라운드에서 컨텍스트를 사용하려고 시도하면 앱이 중지됩니다.

+0

답해 주셔서 감사합니다. 아직도 그것은 각 활동을 추적하는 것보다 훨씬 더 많은 작업으로 보인다. 지금은 onCreate에서 true로 activeAlive 부울을 설정하고 onDestroy에서 false로 설정하고 대화 상자를 표시하기 전에 활성 확인을 수행합니다. – Slickelito

+0

정말 고통처럼 보입니다. 나는 내 다음 앱을 쓰고 대화를 피하려고 노력 중이다. 회전/최소화 문제는 단지 고통입니다. –

+0

지불 기한을 알려주십시오. 게시물은 다음과 같습니다. http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/ –

관련 문제