Анимации могут выполняться только на потках Looper в Android
Я пытаюсь анимировать элемент после завершения задачи, но сталкиваюсь с ошибкой:
android.util.AndroidRuntimeException: Animators may only be run on Looper threads
at android.animation.ValueAnimator.cancel(ValueAnimator.java:1004)
at android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.java:965)
at android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.java:921)
at android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.java:735)
at com.design.zaton.prototypei.MainActivity$1$1.run(MainActivity.java:93)
at java.lang.Thread.run(Thread.java:761)
Приложение работало нормально раньше с тем же кодом, но теперь анимация не запускается, и я сильно запутался.
Ошибка возникает в следующем участке кода:
new Thread(new Runnable() {
@Override
public void run() {
final String s = getGiphyViews(String.valueOf(mEdit.getText()));
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText(s);
}
});
loading.animate()
.alpha(0)
.setDuration(100);
done.animate()
.scaleY(1)
.scaleX(1)
.setDuration(300);
}
}).start();
Ошибка указывает на метод loading.animate()
.
Буду признателен за помощь!
4 ответ(ов)
Чтобы выполнить код в главном (UI) потоке в Android, вы можете использовать метод runOnUiThread()
. Вот пример:
runOnUiThread(new Runnable() {
@Override
public void run() {
// Ваш код здесь
}
});
Этот фрагмент кода гарантирует, что переданный в метод run()
код будет выполнен на основном потоке приложения. Это бывает необходимо, например, если вы хотите обновить пользовательский интерфейс из фонового потока, так как изменения UI должны выполняться именно в главном потоке.
Вы можете использовать Handler
с Looper.getMainLooper()
для выполнения кода с задержкой. Вот пример, как это сделать:
Handler(Looper.getMainLooper()).postDelayed({
// Ваш код
}, 1000)
В этом коде мы передаем анонимную функцию, которая будет выполнена через 1000 миллисекунд (или 1 секунду). Однако, если вы решите, что задержка не нужна, просто уберите этот блок кода и выполните нужные операции сразу. Не забудьте, что задержка может повлиять на пользовательский интерфейс, поэтому используйте её с осторожностью.
Ваш вопрос на StackOverflow звучит примерно так: "Где в моем коде возникает ошибка, и как выполнять сетевые операции?".
Чтобы помочь вам лучше понять, как это работает, вот перевод вашей фразы на русский с примером кода:
new Handler().post(new Runnable() {
@Override
public void run() {
// добавьте здесь ваш код
}
});
Обратите внимание, что важно выполнять сетевые операции вне основного потока (UI потока) для того, чтобы избежать блокировки пользовательского интерфейса. Вы можете использовать AsyncTask
, Thread
, или библиотеки, такие как Retrofit или OkHttp для выполнения сетевых задач.
Если у вас конкретная ошибка, пожалуйста, укажите часть вашего кода, где она возникает, и текст самой ошибки. Это поможет предоставить более точное решение.
Вы можете создать экземпляр основного обработчика в вашем Activity и переопределить метод handleMessage()
. Сохраните экземпляр обработчика в вашем рабочем потоке. Когда работа завершится, используйте обработчик, чтобы отправить сообщение, и вы получите это сообщение в методе handleMessage()
. Таким образом, вы сможете запустить анимацию из метода handleMessage()
и дальше продолжать работу.
Что значит 'synchronized'?
Как вызвать метод с задержкой в Android
Использование контекста в фрагменте
Как проверить доступ к интернету на Android? InetAddress никогда не выдает таймаут
Room - Директория экспорта схемы не указана аннотационному процессору, не удается экспортировать схему