在我的活动中,我的应用程序通过Http Connection从网站下载了一些内容。在此列表中显示的内容之前,我有一个正在加载... TextView,带有一点旋转的ProgressBar,表示数据已被正常下载。
我注意到,如果我在从网络获取数据的过程中执行任何类型的Thread.sleep()
,它会冻结旋转ProgressBar
。
即使我把方法放在它自己的Handler Runnable
中,以便它在它自己的线程上,动画冻结仍然会发生。
我能做些什么吗?
答案 0 :(得分:2)
是的,请使用AsyncTask。
Handler
通常附加到UI线程。向其发布Runnable
并不会改变它们将在UI线程上运行的事实。
答案 1 :(得分:1)
任何应用程序都应该在UI线程的单独线程上执行长时间运行的任务,因为任何阻塞调用都不允许UI更新。
正如另一张海报所说,仅使用Runnables并不意味着代码将在单独的线程上执行。在这种情况下,run()方法将在创建Handler对象的任何线程上执行。子类Thread或将runnabe传递给public Thread (Runnable runnable)的新线程对象。
使用AsyncTasks,Loaders或Threads会有所帮助。
另请阅读Designing for Responsiveness和Multithreading For Performance。遵循上述方法将帮助您避免ANR
答案 2 :(得分:1)
这种行为的原因是: 当你在runnable中执行thread.sleep()时,它是执行该runnable而不是你创建的相应其他线程的UI线程。基本上发生的是当你通过UI线程的处理程序发布任何runnable时,UI线程将从其队列中轮询并执行runnable;在这种情况下,runnable会睡觉。
因此进度条没有变化