2012-01-03 3 views
1

내 활동으로 실행되는 작업자 스레드가 있습니다. 활동을 종료 할 때 (예 : onPause()),이 스레드에 메시지를 보내고 잘못 된 것이없는 한 잠시 후 (밀리 초) 완료해야합니다. 일반적으로 onPause()에서 join()을 사용 하겠지만,이 경우에는이 스레드가 종료 순서를 수행하기 위해 UI 스레드를 사용해야합니다 (액세서리 파일 설명자를 닫으면 다른 스레드에서 작동하지 않습니다)). UI 스레드를 차단하려고하면 교착 상태가 발생합니다. 스레드가 종료 될 때까지 어떻게 든 앱 종료를 연기 할 솔루션을 찾고 있습니다. 아마도 이런 경우에 출구를 중단 할 수만 있다면 나중에 수동으로 finish()를 호출 할 수 있지만이 작업을 수행 할 수 있는지 여부는 확실하지 않습니다.정리 작업이 완료 될 때까지 Android 활동 차단하기

스레드가 결국 정리를 끝내고 종료하는 것이 매우 안전하지 않은 것처럼 보인다고 가정합니다.

답변

1

앞에서 설명한 것처럼 백그라운드 스레드가 무기한 중지되기를 기다리는 UI 스레드를 유지할 수 없습니다.

다음 작업을 수행 할 수 있습니다.

1)) onPause에서 스레드를 (인터럽트. (당신이 정리 중에하려는 경우 당신이 몇 가지 정보를 유지하고 깨끗한 종료를 수행하려면

2), 당신은 시작할 수 있습니다) 어떤 정보를 유지하지 않습니다 onPause()에서 Androiod 서비스를 수행하고 거기에서 정리하십시오. 전 (적시 스레드 기계가 부울 플래그를 확인) : 의사 예를

void run(){ 
while(true){ 
    if(bExit){ 
    doCleanupWork(); 
    } 
    //Do work 
    doWork(); 

    } 
} 

void doCleanupWork(){ 
startCleanupService(); 
} 

void onPause(){ 
bExit = true; 
} 

편집

3) 활동 클래스의 onBackPressed()를 오버라이드 (override)가 directly.Start에게 AsyncTask를 종료하지 않도록 doInBackground()에서 정리 호출이 발생하는 동안 처리를 나타내는 대화 상자를 표시합니다. 정리 작업이 중단 될 수 있는지 확실하지 않으면 코드를 다시 확인하고 필요한 경우 시간 초과 후 스레드를 인터럽트해야합니다.

+0

응용 프로그램이 종료 된 후 정리를 수행하는 것은 문제가되지 않습니다. 문제는 정리가 완료 될 때까지 응용 프로그램 종료를 연기하는 것입니다. – Ytai

+0

수정 사항을 확인하십시오. –

+0

(3) : onBackPressed()는 앱 종료시 유일한 상황이 아닙니다. 가능하다면 가능한 모든 출구 경로를 덮으려는 시도는 매우 신뢰할 수없고 휴대하기 어렵고 비 미래 보장적입니다. AsyncTask는 완전히 불필요합니다. 일반적으로 정리에는 밀리 초가 소요됩니다. 난 그냥 중단하고 이전 실행을 완전히 정리하기 전에 응용 프로그램이 다시 시작하지 않도록 모든 기회를 잡기를 원합니다. – Ytai

0

UI 스레드에서 처리기를 선언하십시오. 다른 스레드가 끝나면 다른 스레드의 (빈) 메시지를 해당 처리기로 보내면 handleMessage 메서드가 UI 스레드에서 실행됩니다. handleMessage에서 최종 UI 정리를 수행하십시오.

+0

그러나 이것은 onPause() 또는 onStop() 메시지가 이미 처리 된 이후에 발생하므로 응용 프로그램이 이미 종료 되었습니까? 달성하기 위해 노력하고있어 스레드가 종료 될 때까지 응용 프로그램의 끝내기 지연 있지만 UI 스레드에서'join()'차단하지 않고 (스레드 정리에 UI 스레드 작업을 포함하는 및 교착 상태가 발생합니다). – Ytai

+0

hmmmm - 단순히 스레드를 onStop에서 종료한다고 말하는 것만으로도 편안함을 느낄 것입니다 ... 어쨌든 종료를 "중지"하는 방법은 없다고 생각합니다. 스레드가 종료 될 때까지 스레드가 알 수있게하는 것입니다. 순서. 스레드가 완전히 정리되지 않을까 우려됩니까? 필요한 작업을 수행 할 시간이 주어져야합니다 (즉, UI 스레드가 완료되면 작업자 스레드가 즉시 삭제되지 않습니다). – elijah

+0

나는 청소 문제를 잡는 것에 대해 우려하고 있습니다. 나는 주변에 갇혀있는 스레드를 갖는 것보다 ANR을 선호한다.또한 앱을 완전히 종료하기 전에 앱이 다시 시작되지 않도록하고 싶습니다. 앱을 중지/즉시 다시 시작하는 경우가 많으며 문제가 발생할 수 있습니다. – Ytai

관련 문제