Аниматоры могут запускаться только на Looper threads 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()
.
Спасибо заранее!
Ответы
Ответ 1
Я думаю, для этого использовалось решение, используя Handler
. Вы можете использовать postDelayed
до минимального значения как 100
и выполнять свои анимационные задачи. В вашем случае это будет:
new Handler().postDelayed(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);
}
}, 100);
У меня была эта проблема сегодня, и выше работа разрешила проблему. Я хотел бы услышать от кого-либо, если есть какие-либо проблемы с этим методом.
Ответ 2
Looper threads - это потоки в Android, которые надолго зацикливаются (или пока вы их не отмените). Они работают совместно с Handlers, которые будут отправлять и отправлять сообщения в потоки Looper
. Аниматоры используют интенсивное использование потоков Looper, потому что они выполняют свои действия в повторяющихся циклах. Это позволяет аниматору не блокироваться после нажатия "запуска", чтобы вы могли продолжать выполнять другие действия.
Чтобы еще больше усложнить ситуацию, вы, скорее всего, выполняете анимацию на объектах View
. Они могут запускаться только в основном потоке пользовательского интерфейса (который является самым большим потоком Looper
). Таким образом, вы не можете запускать эти анимации в отдельных потоках, как вы пытаетесь.
Ответ 3
runOnUiThread(new Runnable() {
@Override
public void run() {
//Your code
}
});
Вы должны выполнить код в потоке пользовательского интерфейса
Ответ 4
Поместить код Где возникают ошибки и выполнение каких-либо сетевых операций
new Handler().post(new Runnable() {
@Override
public void run() {
// add your code here
}
});
Ответ 5
Я думаю, вы можете создать экземпляр основного обработчика в своей активности и переопределить метод сообщения с дескриптором. вы можете сохранить цитату обработчика в своем рабочем потоке. Когда вы закончили работу, вы можете использовать обработчик для отправки сообщения, и вы получаете сообщение в методе сообщения с обработкой. Чтобы запустить анимацию из метода сообщения обработчика и так далее...