Аниматоры могут запускаться только на 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

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