2013-07-06 2 views
0

나는 하나의 스레드에 대해 이야기하고있다. 온 클릭() 핸들러 (물론, 우리가 가진 클릭 된 버튼)의 실행에 의해코드 실행이 메인 이벤트 루프에 의해 중단 될 수 있습니까?

/* TOP LEVEL OF EXECUTION LOOPER NOW WORKING */ 

class MyActivity extends Activity { 
void onCreate(Bundle instance) { 
super.onCreate(instance); 
setContentView(R.layout.activity_main); 
doComplicatedStuff(); 
} 

void doComplicatedStuff() { 
// Doing stuf 
} 

void onClick() { 
// Process event 
} 

void anyOtherMethod() { 
    /* NOT TOP LEVEL OF EXEUCTION, LOOPER NOW CAN'T WORK */ 
} 
} 

/* TOP LEVEL OF EXECUTION, LOOPER NOW WORKING */ 

그래서 제 질문은, doComplicatedStuff() 중단 될 수 있습니다 예를 들어 나는 그것의 활동 UI와 다음과 같은 방법이 있습니까?

이제는 doClick() 처리기가 doComplicatedStuff()가 작업을 끝낼 때까지 doComplicatedStuff()를 중단시킬 수 없다고 생각합니다. 최상위 레벨의 코드 실행에는 Looper가 있기 때문에 다음 메시지 이벤트를 받아 처리기 (처리기를 호출 한 다음 onClick() 메서드 호출)에 전달합니다. 즉, 루퍼는이 스레드에 실행 방법이없는 경우에만 작업을 수행합니다.

답변

1

정확합니다. GUI 스레드는 onCreate 함수에서 사용 중이므로 루퍼에 항목을 제출하는 경우에도 onClick 메서드를 호출하여 complexStuff를 인터럽트 할 수 없습니다.

실제로 이러한 종류의 작업은 둘 이상의 스레드가 관련된 경우에만 가능합니다. 그렇더라도 runOnUiThread를 제출해야한다면 장기 실행 작업이 진행 중일 때 실패 할 수 있습니다.

두 번째 스레드에서 complexStuff 루틴을 수행하는 것이 좋습니다. 장기 실행 작업은 UI 스레드에 속하지 않습니다.

+0

대단히 감사합니다! 어제 나는 질문을했습니다. 이 질문은 runOnUiThread에 관한 것이므로 질문에 대한 답변 (http://stackoverflow.com/questions/17489551/multiple-asynctasks-onpostexecute-order)이 올바르지 않다고 생각하십니까? –

+0

그의 대답은 정확하고 내 것도 그렇습니다. 이 두 가지 문제는 별도의 문제를 해결합니다. Mine은 하나의 스레드 만 실행 중이라고 가정합니다. 그는 그렇게하지 않으므로 비동기로 작업을 실행할 수 있습니다. 그러나 한 번에 하나의 작업 만 GUI를 업데이트합니다. GUI에서 하나의 항목이 작동 중일 때이 항목이 원하는 경우 다른 비동기 작업을 방해 할 수 있습니다. 그러나 다른 작업은 어느 상태 에나있을 수 있습니다. 이미 완료되었을 수도 있습니다. 나는이 접근법을 제안하지 않을 것이다. –