【问题标题】:Android - Thread.sleep and Handler.postDelayed() freezes animated UI elementsAndroid - Thread.sleep 和 Handler.postDelayed() 冻结动画 UI 元素
【发布时间】:2011-10-21 15:22:39
【问题描述】:

在我的活动中,我的应用通过 Http 连接从网站下载内容列表。在此列表显示在屏幕上之前,我有一个 Loading... TextView,它带有一个旋转的 ProgressBar,表示正在下载数据。

我注意到,如果我在从 Web 获取数据的过程中执行任何类型的 Thread.sleep(),它会冻结旋转的 ProgressBar

即使我将方法放在它自己的Handler Runnable 中,使其在自己的线程上,动画冻结仍然会发生。

对此我有什么办法吗?

【问题讨论】:

    标签: java android


    【解决方案1】:

    是的,使用AsyncTask

    Handler 通常附加到 UI 线程。向其发布 Runnables 并不会改变它们将在 UI 线程上运行的事实。

    【讨论】:

    • 哦,有趣...我一定误读了关于 Runnables 的内容。谢谢!
    【解决方案2】:

    任何应用程序都应该在与 UI 线程分开的线程上执行长时间运行的任务,因为任何阻塞调用都不允许 UI 更新。

    正如另一位发帖人所说,单独使用 Runnables 并不意味着代码将在单独的线程上执行。在这种情况下,run() 方法将在创建 Handler 对象的任何线程上执行。子类化 Thread 或使用 public Thread (Runnable runnable) 将你的 runnabe 传递给新的线程对象。

    使用AsyncTasksLoadersThreads 会有所帮助。

    另请阅读Designing for ResponsivenessMultithreading For Performance。遵循上述方法将帮助您避免 ANR

    【讨论】:

      【解决方案3】:

      这种行为的原因是: 当您在可运行对象中执行 thread.sleep() 时,执行该可运行对象的是 UI 线程,而不是您创建的相应其他线程。基本上发生的情况是,当您通过 UI 线程的处理程序发布任何可运行对象时,UI 线程将从其队列中轮询并执行可运行对象;在这种情况下,runnable 会休眠。

      因此进度条没有变化

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-30
        • 2022-11-14
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        相关资源
        最近更新 更多