Java 动画师只能在机器人的活套线程上运行

Java 动画师只能在机器人的活套线程上运行,java,android,multithreading,android-animation,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(V

当一项任务完成时,我正在尝试制作一些动画。这里的问题是,我收到以下错误消息:

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();
错误概述了加载.animate()的
方法

提前谢谢

是Android中永久循环的线程(或直到您取消它们)。它们与线程一起工作,将向
Looper
线程发布和发送消息。动画师大量使用活套线程,因为他们在重复周期中执行动作。这允许动画师在您按下“开始”后不阻塞,以便您可以继续执行其他操作


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

我认为您可以在活动中创建一个主处理程序实例,并重写handle message方法。您可以在工作线程中保存处理程序引号。完成工作后,您可以使用处理程序发送消息,并在处理消息方法中接收消息。要从handler消息方法等启动动画…

我认为,使用
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);

我今天遇到了这个问题,通过以上工作解决了这个问题。如果这种方法有任何问题,我很乐意听取任何人的意见。

将代码放在哪里,并执行任何网络操作

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

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

你能对如何使用你的代码片段添加一些解释吗?我更喜欢这个答案,因为你不必添加延迟。PS-如果在片段中使用它,您将使用
requireActivity().runOnUiThread(…)
+1请注意,主UI线程(可通过调用
runOnUiThread
使用)是最大的
活套
线程。
runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Your code
            }
});