【问题标题】: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 传递给新的线程对象。

    使用AsyncTasks、Loaders 或Threads 会有所帮助。

    另请阅读Designing for Responsiveness 和Multithreading 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
        相关资源
        最近更新 更多