2012-06-20 2 views
1

Может ли кто-нибудь предоставить пример реализации для поворота кнопки в потоке? В настоящее время я вращающаяся свою кнопку в потоке пользовательского интерфейса, используя следующий код:Android: Вращающаяся кнопка на потоке

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

Вы хотите использовать нить, чтобы повернуть кнопку? – Samuel

+0

Да, это то, что я хочу сделать. – AndroidDev93

+0

У вас будет червячка времени, вращающего кнопку в 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(); 

вы могли бы в конечном итоге придется создать AsyncTask, которые могут работать независимо друг от друга, не нарушая UI Thread.

+0

Это все еще заставляет кнопку поворачиваться после обработки данных. – AndroidDev93

+0

Я бы рекомендовал обработать ваши данные через 'AsyncTask' и повернуть кнопку на' UI Thread'. Логика заключается в том, что это «Задача пользовательского интерфейса», и вы можете передать ее на «рабочий поток», но «рабочий поток» в конечном итоге должен принять эту задачу в «поток пользовательского интерфейса» и обработать ее. Но обработка данных через «AsyncTask» позволит «рабочий поток» выполнять всю обработку данных, а кнопка «Пользовательский поток» поворачивается. – Mayank

0

в вашем UI потоке определяют

Handler mainHandler = new Handler(); 

затем внутри нити, используйте:

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

Это послужило мне до сих пор в нескольких случаях, надеюсь, это и для вас! : D

EDIT:

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

, если вы хотите определить «someBoolean» внутри класса, так же, как вы делали с обработчиком, поток должен получить его, я считаю.
таким образом, после обработки ваших данных просто установите someBoolean на false и вращающиеся остановки.

+0

Я думаю, что это все равно собирается опубликовать runnable для потока пользовательского интерфейса. Вам нужно будет создать объект Thread вместо Runnable, чтобы отключить его от потока пользовательского интерфейса. – FoamyGuy

+0

Это то, что он должен делать, что я понял из его вопроса, заключается в том, что он хочет манипулировать пользовательским интерфейсом внутри другого потока. –

+0

Я в основном хочу, чтобы кнопка вращалась во время обработки данных. Позволит ли я это сделать? – AndroidDev93

0

К сожалению, у меня нет доступа к моей IDE на данный момент, поэтому я собираюсь перечислить шаги для вас, вместо того, чтобы указывать здесь код ошибки.

1) Внедрите «AnimationListener» в том же классе, который расширяет Activity. 2) Установите кнопку прослушивания кликов на вашей кнопке. 3) Создайте класс AsyncTask. 4) Переопределите doInBackground (из AsyncTask) и разместите там свою ресурсоемкую логику. 5) В onAnimationStart (из AnimationListener) реализует логику для вызова вашей AsyncTask, то есть нового MyTask(). Execute(); 6) Определите анимацию и установите ее на свою кнопку.

Вот как это должно быть: вы нажимаете кнопку, вызывается onAnimationStart, логика и анимация AsyncTask начинаются. Таким образом, вы можете поворачивать свою кнопку тем же, что ваш фоновый поток выполняет операции с интенсивным использованием ресурсов, то есть одновременно.

И только для удовольствия вам может понадобиться отключить вашу кнопку от повторного нажатия перед завершением фоновой задачи.

Извините за недостаток кода, но это должно быть довольно прямолинейно отсюда.