Может ли кто-нибудь предоставить примерную реализацию для поворота кнопки в потоке? На данный момент я вращаю свою кнопку в потоке пользовательского интерфейса, используя следующий код:
Animation ranim = (Animation) AnimationUtils.loadAnimation(getBaseContext(),
R.anim.rotation);
buttonRotate.setAnimation(ranim);
следующие должны работать на вас.
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
который может работать независимо, не нарушая AsyncTask
UI Thread
.
AsyncTask
и повернуть кнопку в AsyncTask
UI Thread
. Логика заключается в том, что это UI Task
и вы можете передать ее worker Thread
но этот worker Thread
конечном итоге должен перенести эту задачу в UI Thread
и обработать ее. Но выполнение обработки данных через AsyncTask
позволит worker Thread
AsyncTask
выполнять всю обработку данных, пока AsyncTask
UI Thread
вращает кнопку.
К сожалению, у меня нет доступа к моей IDE на данный момент, поэтому я собираюсь перечислить шаги для вас, вместо того, чтобы указывать здесь код ошибки.
1) Внедрите "AnimationListener" в том же классе, который расширяет Activity. 2) Установите кнопку прослушивания кликов на вашей кнопке. 3) Создайте класс AsyncTask. 4) Переопределите doInBackground (из AsyncTask) и разместите там свою ресурсоемкую логику. 5) В onAnimationStart (из AnimationListener) реализует логику для вызова вашей AsyncTask, то есть новую MyTask(). Execute(); 6) Определите анимацию и установите ее на свою кнопку.
Вот как это должно получиться: вы нажимаете кнопку, вызывается onAnimationStart, запускаются логика и анимация AsyncTask. Таким образом, вы можете поворачивать свою кнопку тем же, что ваш фоновый поток выполняет интенсивные операции с ресурсами - то есть одновременно.
И просто для удовольствия, вы можете отключить кнопку от щелчка снова до завершения фоновой задачи.
Извините за недостаток кода, но это должно быть довольно прямолинейно отсюда.
в потоке пользовательского интерфейса определите
Handler mainHandler = new Handler();
затем внутри вашей нити, используйте это:
mainHandler.post(new Runnable()
{
public void run()
{
//your piece of code
}
});
Это послужило мне до сих пор в нескольких случаях, надеюсь, это и для вас! : D
РЕДАКТИРОВАТЬ:
mainHandler.post(new Runnable()
{
public void run()
{
while(someBoolean==true)
{
//your piece of code
}
}
});
если бы вы определили "someBoolean" внутри вашего класса, как и вы с обработчиком, поток, как предполагается, получит его, я считаю.
таким образом, после обработки ваших данных просто установите someBoolean на false, а вращающиеся остановки.