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
}
});