2014-01-10 2 views
1

나는 안드로이드 카메라에서 얻은 라이브 프레임을 작업 중입니다. 나는 모든 프레임을 다룰 수는 없지만, 할 때, 나는 스레드를 생성하여 UI 스레드를 응답하게 유지한다. 문제는이 새로운 스레드 내에서 어떤 점에서 서버를 업데이트하여 Asynctask을 시작한다는 것입니다.AsyncTask oddity

설명서에 따르면 Asynctasks은 UI 스레드에 의해 시작되어야합니다. 그래서 runOnUiThread을 사용하여 시작합니다. 문서에 따르면 어떤 일이 일어나는지는 내가 활동을 변경하거나 구성을 변경하면 활동이 다시 시작되고 작업이 사라지고 데이터베이스 응답이 서버 테이블에 저장되지 않는다는 것입니다. 나는 궁금해서 작업자 스레드에서 Asynctasks을 시작하려고 노력했다. 활동이 변경 되더라도 서버 응답을받습니다. 흥미로운 점은 내 UI 스레드가 1이고 작업자 스레드가 2 인 경우 서버의 응답 처리가 1이 아니라 2에서 발생한다는 것입니다. 스레드 2가 완료 되었기 때문에 더 많은 또는 덜 이해할 수 있으므로 asynctask가 스레드 1,하지만 난 정말 왜이 스레드는 여전히 다른 활동에있어 실행중인 이유 모르겠어? 아무도 무슨 일이 일어 났는지 압니까?

이 효과가 매우 유용한 것처럼 보일지라도 사용하는 것은 좋지 않습니다. 그러나 나는 왜 그것이이 방법으로 작동하는지에 대해 궁금합니다.

+0

이것을 확인하십시오. 도움이 될만한 http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html – Raghunandan

+0

'Handler'가 순환 전 또는 다른 설정 변경 전에'Message'를 수신하면, 여러분의 메세지는 'onPause' 전에 실행되면, 나중에 Message를받는다면, 새로운 Activity가 생성 된 후에 실행됩니다. 변경을 처리하고 그것을 새로운'Activity'에 첨부하기 만하면됩니다. – vamsiampolu

+0

감사합니다. Raghunandan, 나는 머리가없는'Fragments'에 대해 이미 알고 있으며, 전송되지 않은 것을 정기적으로 확인하기 때문에 연결을 유지할 필요가 절대적으로 필요하지 않습니다. 나는 완전히 다른 'Activity'에 있어도 서버 응답을 어떻게 처리 할 수 ​​있는지 이해하고 싶습니다. – Dude

답변

0

구성이 변경되면 (일반적으로 말하면) 활동이 다시 생성됩니다.. 그 순간 활동의 인스턴스가 2 개 있습니다. 보류중인 컬렉션과 새 컬렉션입니다. 예전에 작업 스레드 W. W가 보류중인 콜렉션이 있다고 가정 해보십시오. 그러나 수집되기 전에 작업을 계속할 수있는 가능성이 매우 높습니다. 무한 while 루프가있는 스레드를 만들면 결국 멈출 것입니다.

UI 스레드에서 AsyncTask를 시작하면 결과가 UI 스레드에 게시됩니다 (onPostExecute에서 전달됨) . 활동이 가비지 콜렉션 보류 중일 때, onPostExecute는 ui 스레드에 게시 (DONE)되지 않습니다.

그러나 작업자 스레드에서 AsyncTask를 시작하면 호출 스레드 (W 스레드)가있는 한 결과가 게시됩니다. "거기에있다"는 대답의 첫 단락에 설명되어 있습니다.