2012-05-30 3 views
2

AsyncTask를 시작할 서비스를 구현하고 싶습니다.Android AsyncTask가 서비스에서 시작되었습니다.

AsyncTask onProgressUpdate()에서 주 스레드의 TableLayout을 업데이트하려고합니다.

모두 괜찮습니다. 의심의 여지가 있습니다. 메인 스레드가 파괴되었거나 표시되지 않는 상황을 어떻게 처리합니까?
서비스는 stopSelf()가 될 때까지 계속 진행되며 이것이 내가 원하는 것입니다.
그러나 AsyncTask는 TableLayout을 업데이트하지 않는 것을 어떻게 알고 있습니까?

답변

0

솔루션은 onResume() 및 onPause()에 대한 메시지를 통해 주 활동이 표시되는지 여부를 알려주는 서비스를 제공하는 방법을 따르는 것으로 생각합니다.

서비스가 차례로 AsyncTak에 플래그를 설정합니다. 플래그가 false이면 UI 업데이트를 수행하지 않고 onProgressUpdate()가 종료됩니다.

서비스 설명서를 제대로 이해했다면 내 서비스를 시작해야하며 끈적이며 동일한 활동으로 묶여 야합니다. 실행중인 서비스를 다시 바인딩하는 방법 만 알아 내면됩니다.

0

좋아, 두 번째 게시물을 읽으면서 나는 더 나은 것을 이해합니다.

여기에 고전적인 생산자 - 소비자 문제가 있습니다. 서비스의 AsyncTask는 소비자 (주요 활동)가 표시해야하는 항목을 생성합니다. 해결 방법은 LinkedBlockingQueue를 사용하여 다운로드 한 모든 항목을 저장하는 것입니다. 액티비티에는 LinkedBlockingQueue에서 폴링 할 자체 AsyncTask가 있어야합니다. 다음은 기본 접근 방식입니다.

서비스에는 데이터를 다운로드하는 AsyncTask가 있습니다. 각 항목은 제한없는 LinkedBlockingQueue에 저장됩니다.

활동은 onResume에서 AsyncTask를 시작하고 onPause에서 취소합니다. 이 작업은 LinkedBlockingQueue를 폴링 한 다음 각 항목을 TableLayout에 표시합니다.

+0

게시물을 너무 빨리 읽은 것 같습니다. UI 작업이 표시되면 TableLayout을 업데이트해야합니다. 알림 영역은 해결책이 아닙니다. 100 개의 파일을 다운로드하고 TableLayout 또는 ListView에 이미로드 된 파일을 라이브로 표시해야하는 백그라운드 작업을 생각해보십시오. – ilomambo

+0

문제에 대한 더 나은 이해를 바탕으로 내 대답을 편집했습니다. – RajV

+0

당신은 내가 지금 가지고있는 것에 두 번째 해결책을주었습니다. ArrayList로 생성하고 UI에 진행 상황을 표시하는 AsyncTask가 있습니다. 사용자가 다른 응용 프로그램으로 이동하더라도 제작자가 살아 있어야하므로 서비스를 사용하도록 코드를 다시 작성하고 싶습니다. 귀하의 답변에서 읽은 것에서 이것은 귀하의 솔루션에 해당하지 않습니다. 내 대답을 보라. – ilomambo

관련 문제