2012-06-20 2 views
1

스레드에서 버튼을 회전시키기 위해 샘플 구현을 제공 할 수 있습니까? 나는 다음과 같은 코드를 사용하여 UI 스레드에서 내 버튼을 회전하고 현재로서는 : 스레드 내에서 다음Android : 회전 버튼 스레드

Handler mainHandler = new Handler(); 

을 정의하여 UI 스레드에서

Animation ranim = (Animation) AnimationUtils.loadAnimation(getBaseContext(), 
        R.anim.rotation); 
       buttonRotate.setAnimation(ranim); 
+0

버튼을 회전시키기 위해 스레드를 사용하고 싶다고 말하고 있습니까? – Samuel

+0

예, 그게 내가하고 싶은 일입니다. – AndroidDev93

+0

업데이트 할 UI 스레드로 돌아 가야하기 때문에 runnable에서 버튼을 돌리면 시간이 지날 것입니다. –

답변

0

다음 작업을 수행해야합니다.

Thread thread = new Thread() 
{ 
    @Override 
    public void run() { 
     try { 
       Animation ranim = (Animation) AnimationUtils.loadAnimation(getBaseContext(), 
       R.anim.rotation); 
       buttonRotate.setAnimation(ranim); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

thread.start(); 

당신은 결국 UI Thread을 방해하지 않고 독립적으로 실행할 수있는 AsyncTask 만들어야 할 수도 있습니다.

+0

데이터가 처리 된 후에도 여전히 버튼이 회전합니다. – AndroidDev93

+0

AsyncTask를 통해 데이터를 처리하고 UI 스레드에서 버튼을 회전하는 것이 좋습니다. 논리는 그것이'UI Task'이고'worker Thread'에 전달할 수 있지만'worker Thread'는 결국 그 작업을'UI Thread'로 가져 와서 처리해야한다는 것입니다. 하지만 AsyncTask를 통해 데이터 처리를하면'UI Thread'가 버튼으로 회전하는 동안'worker Thread'가 모든 데이터 처리를하게됩니다. – Mayank

0

를, 이것을 사용 :

mainHandler.post(new Runnable() 
{ 
    public void run() 
    { 
     //your piece of code 
    } 
}); 

이것은 여러 가지 경우에 지금까지 나를 잘 섬겼습니다. : D

편집 : 당신은 당신이 핸들러와 함께했던 것처럼, 스레드가 그것을 얻을 것으로 예상되는, 클래스 내부 'someBoolean'정의하려는 경우

mainHandler.post(new Runnable() 
{ 
    public void run() 
    { 
      while(someBoolean==true) 
      { 
       //your piece of code 
      } 
    } 
}); 

, 저는 믿습니다.
이렇게하면 데이터를 처리 한 후 someBoolean을 false로 설정하면 회전이 중지됩니다.

+0

나는 이것이 여전히 UI 스레드에 실행 파일을 게시 할 것이라고 생각한다. Runnable 대신에 Thread 객체를 만들어서 UI 스레드에서 꺼내야 할 것이다. – FoamyGuy

+0

그것이 무엇을 해야하는지, 그의 질문에서 이해할 수있는 것은 다른 스레드의 UI를 조작하고 싶다는 것입니다. –

+0

기본적으로 데이터가 처리되는 동안 버튼이 회전되기를 원합니다. 이게 내가 그렇게 할 수 있을까? – AndroidDev93

0

불행히도 현재 IDE에 액세스 할 수 없으므로 여기에 버그가있는 코드를 넣으려는 단계를 나열 할 것입니다.

1) Activity를 확장하는 클래스와 동일한 클래스에 "AnimationListener"를 구현합니다. 2) 버튼에 클릭 리스너를 설정하십시오. 3) AsyncTask 클래스를 만듭니다. 4) AsyncTask의 doInBackground를 덮어 쓰고 리소스 집약 로직을 배치하십시오. 5) onAnimationStart (AnimationListener)에서 AsyncTask를 호출하는 로직을 구현합니다. 즉, 새 MyTask(). execute(); 6) 애니메이션을 정의하고 단추로 설정하십시오.

이것이 어떻게되어야할까요? 단추를 클릭하면 onAnimationStart가 호출되고 AsyncTask 논리와 애니메이션이 모두 시작됩니다. 이렇게하면 백그라운드 스레드가 리소스 집약적 인 작업 (즉, 동시에)을 수행하는 것과 동일한 방식으로 버튼을 회전시킬 수 있습니다.

단지 재미 있기 때문에 백그라운드 작업이 끝나기 전에 다시 버튼이 클릭되지 않도록 할 수 있습니다.

코드 부족으로 불편을 끼쳐 드려 죄송합니다.