我的应用程序没有在UI线程上执行的频繁操作,并且需要很长时间(最多3秒)。我想要展示一个动画片“等待”。那段时间的适应症。例如,旋转的旋转器。无需显示实际进度,只需修复速度动画。
我创建了一个在长时间操作期间弹出的自定义对话框,它具有此布局
<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinner"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
问题是它不会旋转。即使UI线程忙,如何使其旋转?
我试图在事件上创建一个链来增加它,但我只得到两个事件,可能是因为UI线程很忙。
// In the custom dialog class. mProgressBar is the ProgressBar in the layout.
// Called externally once when the dialog is shown
public void tick() {
mProgressBar.incrementProgressBy(10);
mProgressBar.postDelayed(new Runnable() {
@Override
public void run() {
// Not a recursion since it's done in a future event.
tick();
}
}, 100);
}
实现此动画的简单方法是什么?逐帧动画会更容易吗?
答案 0 :(得分:1)
使用AsyncTask http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html它不是旋转的,因为它在UI线程中执行
答案 1 :(得分:1)
您可能需要在xml或代码
中为android:indeterminate属性设置true值答案 2 :(得分:1)
Android:你做错了......
如果你在UI线程上做了很长时间的事情,你的应用就会冻结。由于你已经锁定了UI线程,你无法制作任何动画(你很幸运得到两个滴答),你不能让你的应用响应触摸或按键,你的用户将看到一个ANR屏幕(可怕的用户体验)。不要在UI线程上执行任何长时间运行的任务,没有任何充分的理由这样做。
我猜你想在UI线程上执行任务,因为你显示的内容取决于任务的结果?在这种情况下,在主线程上显示一个微调器,在后台运行任务(AsyncTask就是为此而设计的),然后只在任务完成后更新你的UI。没有糟糕的用户体验,同样的最终结果。