Android - Thread.sleep和Handler.postDelayed()冻结动画UI元素

时间:2011-10-21 15:22:39

标签: java android

在我的活动中,我的应用程序通过Http Connection从网站下载了一些内容。在此列表中显示的内容之前,我有一个正在加载... TextView,带有一点旋转的ProgressBar,表示数据已被正常下载。

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

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

我能做些什么吗?

3 个答案:

答案 0 :(得分:2)

是的,请使用AsyncTask

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

答案 1 :(得分:1)

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

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

使用AsyncTasksLoadersThreads会有所帮助。

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

答案 2 :(得分:1)

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

因此进度条没有变化