2012-08-07 5 views
2

try 블록이 먼저 실행되는 이유는 색상을 먼저 변경 한 다음 5000ms 동안 잠자기해야합니다. 나는 색상 변경 전에 시스템이 잠든 것을 의미합니다. 또한 업데이트를 수행하는 동일한 스레드 (스윙에 EDT 소위) 개인 OnClickListener를 CheckAnswer = 새로운 OnClickListener를() {당신은 GUI의 주 스레드에서 작업하는왜 Sleep이 먼저 실행되고 위의 코드가 android에서 실행됩니까?

public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

     disableButtons(); 
     Button incoming=(Button) arg0; 
     if(incoming.getText().toString().equals(Q.getAnswer())) 
     { 
      incoming.setBackgroundColor(Color.GREEN); 
      correct++; 
      score+=15; 
     } 
     else 
     { 
      incoming.setBackgroundColor(Color.RED); 
      wrong++; 
      if(C1.getText().toString().equals(Q.getAnswer())) 
       C1.setBackgroundColor(Color.GREEN); 
      else if(C2.getText().toString().equals(Q.getAnswer())) 
       C2.setBackgroundColor(Color.GREEN); 
      else if(C3.getText().toString().equals(Q.getAnswer())) 
       C3.setBackgroundColor(Color.GREEN); 
      modifyScore(); 

     } 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     questionGenerator(); 
    } 
};` 
+0

나는 shure가 아니지만 색상을 변경 한 후에 요소를 다시 그려야 할 수도 있습니다. – PKeidel

+4

왜 UI 스레드를 잠자고 싶습니까? –

답변

9

보기의 속성이 업데이트되었지만 화면 다시 그리기가 잠자기 상태로되어 있기 때문에 추측 할 수 있습니다. 주 스레드에서 잠을 자지 마십시오.

대신에 활동의 onCreate에 처리기를 만들고 지연된 Runnable을 게시하십시오.

private Handler mHandler; 
protected void onCreate(Bundle savedInstanceState) { 
    mHandler = new Handler(); 
} 
... 
private OnClickListener CheckAnswer = new OnClickListener() { 
    public void onClick(View view) { 
     // fix up view 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       questionGenerator(); 
      } 
     }, 10000); 
    } 
} 
+0

thankssss alot man, SOLVED :) – Art

+0

당신의 질문을 해결하면 그의 대답을 수락하는 것을 잊지 마십시오! – yshavit

2

. 그래서 순서는 다음과 같습니다

  1. 새로운 배경 색상
  2. 수면을 십초
  3. onClick 반환
  4. 메인 쓰레드가 구성 요소를 업데이트 할 수있는 기회를 가지고 설정

나는 '당신이 생각 그러면 배경 색상이 변경되지 않을뿐만 아니라 Thread.sleep이 완료 될 때까지 전체 UI가 고정 된 것처럼 보일 것입니다.

다른 스레드에서 주 작업을해야합니다 (Android는 모르겠지만 Swing에서 SwingWorker을 사용할 수 있음). 따라서 스레드는 구성 요소 업데이트를 포함하여 해당 작업을 수행 할 수 있습니다.

+0

스윙? Android는 스윙을 사용하지 않습니다. – Squonk

+0

그래, 안드로이드는 스윙을 사용하지 않습니다. – Art

+0

스윙을 사용하지 않았지만 상상할 수도 있지만 원리는 비슷합니다. 안드로이드는 yshavit가 참조하는 것처럼 이벤트 발송 스레드를 가지고 있습니다. 이것은 그리기/UI 업데이트가 수행되는 스레드이기도합니다. 일반적으로 안드로이드에서는 이것을 "UI 스레드"또는 (더 적절하게) "메인 스레드"라고합니다. – cyngus

0

먼저 UI 스레드에서 잠을 자지 않으면 강제 닫기가 발생합니다. 둘째, OnClickListener가 끝날 때까지 컨트롤의 실제 (다시) 페인팅을 수행 할 수 없습니다.

+0

어떻게해야할까요? – Art

+1

@Art :'Handler'의'postDelayed' 메소드 사용에 관해서는 cygnus의 답을보십시오. – Squonk

관련 문제