Android AsyncTask与线程在特定情况下的区别

3
我正在开发一个应用程序,它看起来类似于Google Play应用程序(在片段中使用网格视图的滑动视图,在网格视图中检索数据[图像+文本]也是从远程服务器检索)。我的问题出现在后台任务上。我不能决定从互联网检索数据时要使用什么。主要是我正在尝试决定是否使用AsyncTask或手动线程。当然,实现AsyncTask会更容易些,但经过一些研究,我注意到许多人认为它有限制。
在我的特定情况下,我想从互联网下载数据作为Json对象,解析它们并在网格视图中显示数据。网格视图将有多达30个项目,每个项目包含缩略图和3个文本视图。在Android文档中,他们说AsyncTask适合短时间操作(最多几秒钟)。填充多达30个项目是否被认为是短时间操作?我希望数据能够同时获取。此外,我想支持API 8及以上的Android手机。我读到对于不同的API,AsyncTask的行为不同(串行或并行)。
我的问题是:对于我的应用程序,使用AsyncTask是否合适?还是必须手动完成所有操作?ThreadPoolExecutor是第三种方法吗?比手动线程更容易吗?
任何建议都将不胜感激,如果不能解决这个问题,我将无法继续实现。
提前致谢!

AsyncTask对于此来说不可靠,线程太低级。考虑使用Loaders:http://amsanjeev.wordpress.com/2011/09/23/an-introduction-to-loaders-in-android/ - Zoltán
谢谢Zoltan,链接非常有帮助! - user1851212
请查看我的答案,针对您的问题,有一个更加简洁的解决方案。 - Zoltán
3个回答

0
去年在伦敦参加DroidCon时,一次演讲引起了我的注意,它解释了为什么使用AsyncTasks从网络加载数据是不可靠的。
这个演讲是关于RoboSpice库的。
该网站还有一个非常好的信息图表,解释了为什么AsyncTasks不可靠以及RoboSpice如何解决这些问题。
免责声明: 我与RoboSpice没有任何关联,也从未尝试过它。我只是被他们的演示所打动和说服,认为这是一个值得尝试的工具。

0

我的理解是,关于仅将AsyncTasks用于短操作的评论更多地针对于不期望在长时间操作完成时相同的视图可用。例如,如果用户离开应用程序并返回或当前活动由于某种原因消失。典型的解决方法是使用Service并在那里启动一个普通的线程,然后发送一些消息告诉当前Activity在操作完成时刷新。

您的数据下载和处理可能是最长的操作。因此,我会以此为基础来确定这是短操作还是长操作。如果您根本不关心持久化数据,并且不介意重新启动下载,即使用户离开并回来,您可以只需轻松使用AsyncTask。

如果您正在使用GridView,则应仅填充足够的视图,以便一次仅显示屏幕上方的数量。

我认为,在您的情况下,假设数据量为几千字节而不是兆字节或数百千字节,AsyncTask是可以接受的。兆字节的数据,我建议使用带有线程的服务。数百k,则是个问题。

此外,请查看Loaders...如果您想看到更适合此类加载的替代方案。


谢谢你的深入回答!然而,你指出了我还没有考虑到的关于GridView人口的问题。我理解你的观点,但这是否意味着当用户向下滚动时,我应该再次连接到远程服务器?或者将它们准备好,以防用户向下滚动,我会填充现在出现在屏幕上的项目? 再次感谢! - user1851212
这真的取决于你要获取的内容量以及用户浏览时的滚动方式。如果用户可能会用力快速滑动到列表底部,最好一开始就加载所有内容。如果用户浏览较慢,则通常可以在用户接近列表或网格底部时进行加载。 - Mike dg

-1

朋友,我正在一个与你需要的项目中工作,为了支持API 8及以上版本,你应该使用Asynctask来下载任何东西,否则在API 15及以上版本中会崩溃,因为即使是短操作,它也不会让你运行应用程序而没有AsyncTask。

所以,由于我已经几乎做了你需要的一切,并且对于API 9以上的版本都很好地工作,你应该使用Asynctask。我已经实现了SherlockActionbar、EndlessAdapter和ViewPager,全部都使用了Asynctask。所以继续前进吧,如果你需要更多帮助,请随时再问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接