Android培训之核心UI线程—离开返回的无缝衔接
2016-03-02 13:30:43
478浏览
作为Android开发者,我们都知道保持uI响应灵敏的重要性.因此开发者把类似I/0操作这样的耗时任务放在后台线程中执行:当后台线程执行完毕后,经常需要更新UI:Android可能与读者熟知的其他uI系统非常相似,并不是线程安全的:在修改任何ImageView之前,必须返回到应用程序主线程中,试图在主线程之外修改uI会导致异常。
Android培训之核心UI线程—离开返回的无缝衔接
初始实现代码使用的是AsyncTask的onPostExecute()方法:因为我们使用Executor代替AsyncTask,因此需要为宿主Activity准备一个Runnable对象:我们会用到Activity的runonu汀hread()方法,该方法会使用Handler在后台将我们的工作添加到u1的消息队列中:
切换到uI线程是需要考虑的二读者必须注意下述几个方面:
口如果用户滚动ListView,ImageView的实例有可能被回收
口宿主Activity有可能在任务完成前已经被销毁
因此,用于处理图片的Runnable的每一步都需要检查是否应该停止处理图片二如果宿主Activity使用ImageWorker的setExit,TasksEarly(1方法设置一个标记(flag),就可以检查到停止状态.该方法需要在onPause()方法中调用。此外,如果FutureTask的cancel()方法被调用,也可以检查到停止状态。
注意事项
对于产品级应用程序,Android官方文档的training小节建议使用更好的磁盘缓存解决方案。原始文档提供的实现方案缺少几个关键部分,为此,这里提供一个更完整的例子,修改磁盘缓存的实现代码,使其支持在应用程序重启时可以重建磁盘缓存,并且不再需要维护这部分代码的两份拷贝。
加载图片等耗时T作需要在uI线程之外执行.这会使类似ListView这样的内置组件平滑运行。读者可以使用一个LIFO队列对加载图片的顺序进行微调,以此获得更好的用户体验。
使用一个可能会生成无数实例的AsyncTask会导致潜在问题。使用executor可以更好地完成AsyncTask的工作。此外,
Android开发在支持库中提供了一个稳定的LruCache实现,用于提供高效缓存解决方案。
查看更多关于“Android培训资讯”的相关文章>>
标签: