动画师只能在Looper线程Android上运行

时间:2016-06-07 21:44:16

标签: java android multithreading android-animation

我试图在任务完成时动画一些东西。这里的问题是我收到此错误消息:

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()方法。

提前致谢!

5 个答案:

答案 0 :(得分:19)

Looper threads是Android中永久循环的线程(或直到你取消它们)。它们与Handlers一起使用,它会向Looper个帖子发送和发送消息。动画师大量使用Looper线程,因为它们在重复循环中执行动作。这使得动画师在您按下“开始”后不会阻止,因此您可以继续执行其他操作。

为了使问题更复杂,您最有可能在View个对象上执行动画。这些只能在主UI线程上运行(这恰好是它们中最大的Looper线程)。因此,您无法像在尝试那样在单独的线程上运行这些动画。

答案 1 :(得分:16)

我认为,使用Handler有一个 solution 。您可以使用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 :(得分:11)

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Your code
            }
});

您必须在UI线程中执行代码

答案 3 :(得分:1)

将代码置于何处获取错误并执行任何网络操作

new Handler().post(new Runnable() {
        @Override
        public void run() {
            // add your code here 
        }
    });

答案 4 :(得分:0)

我认为你可以在你的活动中创建一个主处理程序实例并覆盖句柄消息方法。您可以在工作线程中保存处理程序引用。完成工作后,您可以使用处理程序发送消息,并在句柄消息方法中接收消息。从处理程序消息方法等开始动画......