2017-12-22 33 views
0

저는 활동 A과 일부 계산을 수행하고 데이터를 데이터베이스에 저장하는 AsyncTask를 가지고 있습니다. 이 작업은 3-5 초 정도 걸립니다. AsyncTask는 "저장"버튼을 누른 후 새로운 활동 B가 시작된 후에 호출됩니다 (이 활동 B는 중요하지 않음). Activity C도 있는데, Activity A 및 AsyncTask에서 저장 한 데이터를로드합니다. 그리고 여기에 내 문제가 있습니다 - 내가 C 작업을 시작하고 AsyncTask가 데이터 저장을 완료하지 못하면 AsyncTask가 완료되고 데이터를 작업에로드 할 때까지 애니메이션로드를 표시하려고합니다.android asynctask가 다른 활동을합니다.

onPostExecute 메서드의 AsyncTask는 전역 변수 "boolean finished = true"를 변경하고 Activity C를 시작한 후에 변수가 true인지 주기적으로 확인합니다. 그러나 나는 그것이 올바른 방법이 아니라고 생각합니다. 그럼 올바른 방법은 무엇입니까? 고맙습니다

+2

왜'onPostExecute' 자체에서 활동 C를 시작하지 않습니까 ?? – Xenolion

+0

@Xenolion 사용자가 아직 Activity C를 표시하고 싶지 않을 수 있기 때문에 – buci

+0

대화 상자를 표시하고 게시에서 전역'boolean' isFinished = false'를 선언하면 변수가 'true'로 변경됩니다. 사용자가 'C'로 이동하기 위해 클릭하면, 기다리는 축배를 표시하지 않는다면'isFinished = true'가 먼저 체크하십시오! – Xenolion

답변

0

활동 C에서 할 수있는 것은 onResume에 데이터베이스가 있는지 예상 결과가 이미 있는지 여부를 확인하는 것입니다. 그것이 있으면 결과를 보여주십시오. 그렇지 않은 경우로드 아이콘을 표시하고 특정 이벤트를 수신하는 브로드 캐스트 수신기를 등록하십시오.

AsyncTaskonPostExecute에서 특정 이벤트를 브로드 캐스팅 할 수 있습니다. 액티비티 C가 해당 이벤트를 받으면 결과가 지금있는 데이터베이스를 간단히 다시 검사 할 수 있습니다.

+1

이것은 까다로워 질 것입니다. 데이터가 없으므로 활동에로드가 있다고 가정합니다. 그것은 방송을 위해 수신기가 부착되어 있습니다. 이제 분명히 문제를 피하려면 onPause/onStop의 수신기를 제거해야합니다. 액티비티가 브로드 캐스트를 수신하기 전에 사용자가 집을 누르고 있다고 가정합니다. 이제 다시 열면 onCreate가 호출되지 않고 방송이 누락 되었기 때문에 진행이 무한합니다. 따라서 onResume에서 데이터를 확인하십시오. – Kushan

+0

네, 수신자를 추가하고 제거하는 위치에 따라 달라집니다. 즉, 데이터베이스 검사가 발생해야합니다. onCreate 대신에 onResume에서 단계를 수행하도록 내 대답을 업데이트 할 것입니다. –

+0

@GlennCodes 및 예상 결과를 모르는 경우 어떻게됩니까? 얼마나 많은 레코드가 저장 될지 모르겠습니다. 내 데이터베이스는 id (테이블), id_player, round_of_match, points, goals 및 다른 플레이어의 속성을 저장합니다. 매치마다 (Save Matches를 누름) AsyncTask는 모든 플레이어가이 레코드를 저장하기 시작합니다 – buci