2013-07-11 5 views
4

안드로이드 활동을 시작할 때 실행되는 코드가 있습니다. 필요한 경우 공유 환경 설정 및 웹 서버에서 읽습니다. 이 중 일부는 주 스레드에서 발생하며 서버 요청은 AsyncTask에 있습니다.안드로이드 활동을 일시 중지 할 때 바이트 코드 실행은 어떻게됩니까?

이제 앱이 일시 중지 된 경우 어떻게되는지 궁금합니다. 바이트 코드는 프로그램 카운터가있는 곳에서 멈추거나 메인 루프에서 일어나는 일이 끝날 때까지 기다린 다음 onPause를 호출합니다.

또한 네트워크에서 데이터를 수신 할 때 콜백에 어떤 일이 생길지 걱정됩니다. 일시 중지에서 재개 한 후 콜백이 발생하거나 항상 손실 될 수 있습니까? 네트워크에서 읽는 스레드가 활동이 일시 중지 된 동안에도 계속 실행될 수 있음을 이해합니다.

답변

3

좋아요. 저는 실험을 해본 결과 안드로이드 소스를 한 눈에 보았습니다. 이제 조금 더 명확 해졌습니다. 내가 찾은

것들 :

  1. onPause, onResume, ONSTART,에서 onCreate 등 모든 (Thread.currentThread.getId()를 인쇄하여) 동일한 스레드 내에서 실행 메인 이벤트 스레드 인이 하나의 이벤트 스레드가 사용됩니다 모든 활동에 대해 (매니페스트에 새 프로세스를 할당하지 않은 경우) 이것은 전적으로 예상치 못한 것은 아니지만, 예를 들어 onPause가 활동을 중지시키는 데 사용 된 시스템 시작 스레드에 살고 있는지 궁금해했습니다.

  2. 코드에서 무한대의 시간 동안 (onResume 또는 버튼 누름의 결과로 실행되는 코드에서) onPause가 실행되면 나머지는 실행되지 않습니다. 또한 루프는 매초마다 로그에 인쇄하여 볼 수있는 것처럼 계속 실행됩니다. 홈 화면 (또는 onPause 및 onStop을 생성해야하는 다른 항목)으로 이동하는 경우에도 이러한 인쇄물이 계속 발생하고 응용 프로그램이 보이지 않아도 루프가 계속됩니다. 당신은 여전히 ​​홈 화면으로 이동합니다. 그리고 만약 당신이 원한다면 애플 리케이션으로 돌아갈 수 있습니다. 따라서 설명서가 활동을 일시 중지하거나 중지하는 동작에 대해 이야기 할 때 응용 프로그램 실행이 중단되거나 (onPause를 호출하기 전에) 주 스레드에서 런타임 예외를 생성하지는 않습니다. 일시 중지 및 종료 활동은 리눅스 프로세스의 개념과는 전혀 관련이 없습니다.

  3. AsyncTask에서 실행되는 웹 요청이 느리다면 asynctask 코드는 예상대로 다른 스레드에서 실행됩니다. 작업을 시작한 활동이 작업이 끝나기 전에 일시 중지되면 onPause, onStop이 정상적으로 호출 된 다음 asynctask가 콜백 (작업에 정의 된)을 완료하면 onPostExecute는 여전히 호출되고 실행됩니다. gUI 스레드. 이것은 "활동"이 깔끔하게 멈췄다는 사실에도 불구하고 있습니다.

은 내가이에서 결론을하는 등 모든 이동 중지 및 ONSTART는 주 스레드에서 호출되는 자신의 차례를 기다려야 만 다른 같은 메인 이벤트 루프에서 이벤트가, 단순히 있다는 것입니다. 그것들은 특별한 것이 아니고, 즉각적으로 실행되지 않거나 이와 같은 것이 아니며 루프의 다른 것에 의해 막힐 수도 있습니다.

Activity의 개념은 실제로 GUI 작업으로, Activity가 중지되면 상호 작용하거나 표시 할 화면이 없습니다. 그러나 이것은 계속 활성화되어 콜백 등을 인쇄하거나 응답 할 수있는 기본 프로세스에 영향을주지 않습니다. JVM은 계속 진행되며 모든 클래스가 계속 존재하며 프로세스가 계속 실행됩니다. 분명히 GUI에서 이벤트 나 상호 작용을받지 못하고 onPause를받은 경우에는 아무것도 수행하지 않아야합니다.어떤 종류의 리소스라도 필요로하는 경우이 프로세스를 종료 할 수 있으므로 라이프 사이클 콜백을 구현해야합니다. 그 일시 중지를 보여줍니다

protected void onPause() { 
     if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this); 
     getApplication().dispatchActivityPaused(this); 
     mCalled = true; 
    } 

에 다음

final void performPause() { 
     mFragments.dispatchPause(); 
     mCalled = false; 
     onPause(); 
     mResumed = false; 

호출에 의해 발생 Activity.java AS를

제외하고 우리는 테스트에서 예상대로 일시 중지가 정말 인 것을 볼 수 있습니다 메인 루프에 다른 이벤트를 보냅니다.

mCalled 변수에는 Activity 파생 클래스에서 super() 버전이 호출되었는지, 시스템에서 자원이 필요한 프로세스를 삭제하기 전에 호출되었는지 확인하는 것이 있습니다 .

어떻게 작동하는지, onPause가 느리거나 짝수 루프의 다른 항목에 의해 차단 된 경우 onPause가 완료되기 전에 프로세스가 종료 될 수 있습니다.

분명히 일부 사람들에게는 분명 할 수 있습니다. 하지만 설명서가 매우 혼란 스럽습니다. 나는 일시 정지가 GUI 스레드가 무엇을하고 있었는지에 대한 런타임 예외를 의미 할 수도 있다고 생각하면서 실행중인 코드, 일시 중지 된 코드 등이 실제로 코드 순서화의 의미에서 무엇인지 이해하지 않고 내 코드가 들어갈 수있는 상태에 대해 추론 할 수 없었다.

내가 완전히 오해하고 잘못된 생각을 가지고 있다면 알려 주시기 바랍니다! 나는 안드로이드 2.5 주만 사용하고 있으며 꽤 혼란 스럽습니다!

관련 문제