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

Adr*_*ier 27 java multithreading android 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)
Run Code Online (Sandbox Code Playgroud)

该应用程序使用相同的确切代码工作正常,但现在它根本没有.我真的很困惑.

这是错误发生的地方:

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();
Run Code Online (Sandbox Code Playgroud)

该错误概述了该loading.animate()方法.

提前致谢!

Dee*_*eeV 23

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

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


Gur*_*Rao 17

我想,出现了一个解决这个使用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);
Run Code Online (Sandbox Code Playgroud)

我今天遇到了这个问题,上面的工作解决了这个问题.如果这个方法有任何问题,我很乐意听到任何人的意见.


Dav*_*ide 13

runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Your code
            }
});
Run Code Online (Sandbox Code Playgroud)

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

  • 我更喜欢这个而不是接受的答案,因为您不必添加延迟。PS - 如果在片段中使用它,您可以使用 `requireActivity().runOnUiThread(...)`; (2认同)