0

Анимации могут выполняться только на потках Looper в Android

12

Я пытаюсь анимировать элемент после завершения задачи, но сталкиваюсь с ошибкой:

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 ответ(ов)

0

Чтобы выполнить код в главном (UI) потоке в Android, вы можете использовать метод runOnUiThread(). Вот пример:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Ваш код здесь
    }
});

Этот фрагмент кода гарантирует, что переданный в метод run() код будет выполнен на основном потоке приложения. Это бывает необходимо, например, если вы хотите обновить пользовательский интерфейс из фонового потока, так как изменения UI должны выполняться именно в главном потоке.

0

Вы можете использовать Handler с Looper.getMainLooper() для выполнения кода с задержкой. Вот пример, как это сделать:

Handler(Looper.getMainLooper()).postDelayed({
    // Ваш код
}, 1000)

В этом коде мы передаем анонимную функцию, которая будет выполнена через 1000 миллисекунд (или 1 секунду). Однако, если вы решите, что задержка не нужна, просто уберите этот блок кода и выполните нужные операции сразу. Не забудьте, что задержка может повлиять на пользовательский интерфейс, поэтому используйте её с осторожностью.

0

Ваш вопрос на StackOverflow звучит примерно так: "Где в моем коде возникает ошибка, и как выполнять сетевые операции?".

Чтобы помочь вам лучше понять, как это работает, вот перевод вашей фразы на русский с примером кода:

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // добавьте здесь ваш код
    }
});

Обратите внимание, что важно выполнять сетевые операции вне основного потока (UI потока) для того, чтобы избежать блокировки пользовательского интерфейса. Вы можете использовать AsyncTask, Thread, или библиотеки, такие как Retrofit или OkHttp для выполнения сетевых задач.

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

0

Вы можете создать экземпляр основного обработчика в вашем Activity и переопределить метод handleMessage(). Сохраните экземпляр обработчика в вашем рабочем потоке. Когда работа завершится, используйте обработчик, чтобы отправить сообщение, и вы получите это сообщение в методе handleMessage(). Таким образом, вы сможете запустить анимацию из метода handleMessage() и дальше продолжать работу.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь