【问题标题】:Spinner animation during long operations长时间操作期间的微调器动画
【发布时间】:2012-03-26 16:36:52
【问题描述】:

我的应用在 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);
}

实现这个动画的简单方法是什么?逐帧动画会更容易做吗?

【问题讨论】:

    标签: android android-animation android-ui android-progressbar android-event


    【解决方案1】:

    使用 AsyncTask http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html 不是自旋,因为它是在 UI 线程中执行的

    【讨论】:

    • 你的意思是调用mProgressBar.incrementProgressBy(10);来自异步任务?即使 UI 线程很忙,在调用 incrementProgressBy() 后,微调器是否会立即在屏幕上更新?
    • 不,您应该实现自己的 AsyncTask,在 onPreExecute 方法中您应该设置您的微调器,在 doInBackground 方法中您应该完成所有工作,在 onPostExecute 中获取结果并关闭微调器。网上有很多关于这个主题的信息,谷歌一下吧
    • 请注意我期望的答案,但可能是正确的做法(将工作加载到异步任务)。标记为答案。
    【解决方案2】:

    您可能需要在 xml 或代码中为 android:indeterminate 属性设置 true 值

    【讨论】:

      【解决方案3】:

      Android:你做错了......

      如果您在 UI 线程上执行的操作需要很长时间,您的应用就会冻结。由于您已锁定 UI 线程,因此您无法制作任何动画(您很幸运得到了两个滴答声),您无法让您的应用响应触摸或按键,并且您的用户将看到 ANR 屏幕(糟糕的用户体验)。永远不要在 UI 线程上执行任何长时间运行的任务,这样做没有任何充分的理由。

      我猜您想在 UI 线程上执行任务,因为您显示的内容取决于任务的结果?在这种情况下,在主线程上显示一个微调器,在后台运行任务(AsyncTask 正是为此而设计的),然后只在任务完成后更新你的 UI。没有可怕的用户体验,同样的最终结果。

      【讨论】:

      • 我正在做的长任务(最多 3 秒)是恢复默认首选项。该应用程序有 30 个左右的首选项,当用户选择“恢复设置”操作时,30 个首选项中的每一个都设置为其默认值。这些首选项更改中的每一个都会触发主应用程序中的首选项侦听器,该侦听器对此首选项更改进行必要的处理。这些处理程序与 UI 相关,因此在 UI 线程上运行。我想我可以将 30 个设置分解为单个 UI 事件(例如通过 post() 方法),这样 UI 线程就不会阻塞太久。
      • 处理程序 UI 是如何(或者可能是为什么)相关的?即使是一堆小的 UI 更改也不应该阻塞三秒钟。您是单独设置和提交每个首选项还是一次全部设置?
      • 最后一次提交。一些设置与小部件相关,它们生成位图文件并更新远程视图(我使用的是自定义字体,远程视图不支持。必须生成两个图像文件,一个用于纵向,一个用于横向,用于当前每个小部件大小使用)。
      • 啊在后台生成位图?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2011-04-08
      • 1970-01-01
      • 2011-06-21
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多