2014-01-08 2 views
1

Record()이라는 로컬 함수 중 하나에서 while 루프를 실행하는 프로그램을 개발 중입니다. X라는 버튼을 누르면 가변 조건이 참이되고 기록 함수가 실행됩니다. 다른 버튼 Y를 눌렀을 때 상황이 바뀌면 루프가 멈추고 싶습니다. 문제는 while 루프가 시작될 때 버튼 Y를 클릭하지 않는 경우입니다. 어떻게해야합니까? while 루프는 조건을 다른 함수로 변경하여 중지합니다. 샘플 코드는 다음과 같다 :실행 중 루프 식을 변경하는 방법

// clicking Button Y 
private View.OnClickListener XonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View arg0) {    
      condition = true;    
      record();    
    } 
} 

// clicking Button Y 
private View.OnClickListener YonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View arg0) {    
      condition = false;   
    } 
} 

// Record function 
private void Record(){ 
    while (condition){   
      // do something 
    } 
} 
+0

* 실제 코드가 없으면 무엇이 잘못되었는지를 정확하게 말하기 어렵습니다 (버그가 무엇인지 모르기 때문에 문제의 원인이되는 비트를 제외했을 수 있습니다). 그러나 처음에는'condition'이'volatile'으로 선언되지 않는다고 추측합니다. – chrylis

+0

어떻게 Record 메서드에 액세스합니까? – Nfear

답변

0

그것은 당신이 UI 스레드에서 while 루프 (또한 메인 스레드라고도 함) 것을 실행하고 질문에서 보인다. 이 스레드는 UI를 구동 (예 : 이미지 그리기)하고 UI로 구동되는 것 (예 : 버튼 클릭 이벤트) 이외의 실제 작업을 수행하지 않아야합니다. 다른 작업은 다른 스레드로 이동해야합니다. 따라서 UI 스레드에서 while 루프를 실행 중이면 버튼 클릭 이벤트를 수신 할 수 없습니다.

는이 here의 일반적인 설명을 찾을 수있는 당신이 좋은 튜토리얼 here을 찾을 수 등 AsyncTask 당신이 비동기 Record() 작업을 할 수 있습니다 메커니즘이 많이 있습니다. 개인적으로 가장 좋아하는 부분은 HandlerThread입니다. 이는 매우 유연하고 쉽게 확장 할 수 있기 때문입니다. 또한 최대한 활용하려면 understandLooperMessage 개념이 필요합니다.

관련 문제