2010-05-04 13 views
1

탭 중 하나가 채팅 유형 기능인 탭 위젯이 있습니다. 일정 간격으로 채팅 데이터를 업데이트하려고합니다 (채팅 탭의 활성 여부에 따라 달라질 수 있음).다른 활동 방법에서 활동 UI 업데이트 중?

내 기본 TabActivity 클래스에서 AsyncTask를 사용하는 것이 가장 좋았습니다. AsyncTask가 실행되는 동안 채팅 활동이 백그라운드에서 파괴되는 것을 피할 수 있었기 때문입니다. Activity가 파괴되고 다시 생성되지 않도록 보장하여 AsyncTask가 실제 활성 활동의 데이터를 수정할 수 없도록했습니다.

그러나 이제 내 AsyncTask가 TabActivity 활동에 포함되었으므로 내 채팅 목록 어댑터를 notifyDataSetChanged()으로 직접 호출 할 수있는 방법이 없습니다. onPostExecute() 메서드를 더 이상 사용하지 마십시오. TabHost/TabActivity에서 주어진 Tab의 현재 Activity에 대한 참조를 가져 오는 방법이 있습니까?

또는, 채팅 활동이 TabActivity 활동의 하위 활동 (절대로 TabActivity가 활성화되어있는 동안 절대로 파괴되지 않음)로 파괴되지 않는다고 가정하고 채팅 활동에 AsyncTask를 넣을 수 있습니까? ?

답변

2

정말 가장 좋은 방법은 실행되는 스레드를 가지고 주기적으로 채팅 데이터를 가져 오는 것입니다. 그런 다음 UI에서 새 메시지를 얻기 위해 스레드를 폴링 할 수 있습니다. 이렇게하면 Activity에 무슨 일이 일어나도 스레드를 실행할 수 있습니다.

+0

이 수정 된 버전은 아름답게 작동했습니다. 내 채팅 활동에서 스레드를 생성하고 주기적 다운로드를 시작하는 해당 스레드에서 핸들러를 만듭니다. 다운로드가 성공적으로 끝나면'runOnUIThread()'내부에서 어댑터 데이터 셋을 업데이트합니다. 그런 다음 핸들러의'postDelayed()'메소드를 사용하여 다음 업데이트주기를 스케쥴한다. 그리고 내 활동이 파괴되면, 나는 내 업데이트 Runnable에'handler.removeCallback()'을 사용한다. 감사! – stormin986

2

탭 호스트에 인 텐트 로딩 메커니즘을 사용하는 경우 작업이 TabHost 자체 (일시 중지됨) 이상으로 임의로 종료되지 않을 것이라고 가정 할 때 안전해야하며 안전하게 그것은 (적어도 당신이 TabHost에서 할 수있는 것처럼).

주의 : 모든 활동은 언제든지 죽일 수 있습니다 (예 : 탭 호스트 자체를 포함하여 사용자가 작업을 실행하는 동안 탭에서 새 활동을 여는 링크를 클릭하는 경우). 작업이 돌아오고 현재 죽은 활동의 UI를 업데이트하려고 시도 할 때 추한 충돌이 발생합니다. 따라서 파괴시 AsyncTasks를 취소하거나 asynctasks가 결과를 반환하기 전에 활동이 여전히 활성화되어 있는지 확인 (Android 소스 트리의 WeakAsyncTask 참조)하거나 Activity-independent (semi) 영구 pollable 백그라운드 스레드 솔루션을 사용하십시오 CaseyB는 (cwac-bus은 그 정맥의 멋진 premade 솔루션입니다) 제안합니다.

다른 방법으로 AsyncTask의 UI 업데이트 코드에서 모든 예외를 catch하고 (자동으로 실패하는 몇 가지 앱을 보았습니다.) 나에게 재미있는 냄새가 날 수도 있습니다.

최근에 저는 WeakAsyncTask의 수정 된 버전을 대부분의 장소에서 사용하여 개인적으로 반환 할 때 작업이 완료되지 않았는지 확인합니다.