Android AsyncTask 与特定情况下的线程
Posted
技术标签:
【中文标题】Android AsyncTask 与特定情况下的线程【英文标题】:Android AsyncTask vs. Threads for a specific case 【发布时间】:2012-12-16 22:59:47 【问题描述】:我正在开发一个看起来类似于 Google Play 应用程序的应用程序(在片段内使用 gridviews 滑动视图,此外 gridview [图像 + 文本] 中的数据是从远程服务器检索的)。
我的问题是后台任务。我无法决定使用什么来从互联网上检索数据。主要是我试图决定是使用 AsyncTask 还是手动线程。 当然,实现 AsyncTask 会更容易,但经过一些研究,我发现很多人发现它有限制。
在我的特殊情况下,我想从 Internet 下载数据作为 Json 对象,解析它们并在 gridview 中显示数据。网格视图最多有 30 个项目,每个项目包含一个缩略图和 3 个文本视图。在 android 文档中,他们说 AsyncTask 适合短操作(最多几秒钟)。填写多达 30 个项目是否会被视为一项短期操作? 我希望同时获取数据。我还想支持 API 8 及更高版本的 Android 手机。我读到对于不同的 API,AsyncTask 的行为不同(串行或同时)
我的问题是:为我的应用程序使用 AsyncTask 是否合适?还是我必须手动完成所有操作? ThreadPoolExecutor 是第三种方法吗?比手动穿线容易吗?
任何建议都将不胜感激,如果不对这个问题做出决定,我就无法推进实施。
提前致谢!
【问题讨论】:
AsyncTask 对此不可靠,线程太低级。考虑使用加载器:amsanjeev.wordpress.com/2011/09/23/… 谢谢 Zoltan,这个链接很有帮助! 请查看我的答案,为您的问题提供更简洁的解决方案。 【参考方案1】:我的理解是,关于仅将 AsyncTasks 用于短操作的评论更多地旨在不期望在长操作完成时可以使用相同的视图。例如,如果用户离开应用程序并返回或当前活动因某种原因消失。解决这个问题的典型方法是使用服务并在那里启动一个普通的旧线程,然后发送一些消息告诉当前活动在操作完成时刷新。
下载和处理您的数据可能是最长的操作。所以我会以此为基础来判断它是短的还是长的。如果您根本不关心持久化数据,也不介意在用户离开和回来时重新开始下载,您可以不加思索地使用 AsyncTask。
如果您使用的是 GridView,则您应该只填充足够的视图,以超过一次显示在屏幕上的数量。
我会说 AsyncTask 在您的情况下很好,假设它是几千字节的数据,而不是兆字节或数百千字节。 Megs 的数据,我会说移动到带有线程的服务。几百k,就是折腾了。
另外,看看 Loaders...如果你想看看更适合这种加载的替代方案。
【讨论】:
感谢您富有洞察力的回答!但是,您指出了关于 GridView 的人口我还没有想到的事情。我明白你的意思,但这是否意味着当用户向下滚动时我应该与远程服务器建立另一个连接?或者让它们准备好,如果用户向下滚动,我会填充现在出现在屏幕上的项目?再次感谢! 这实际上取决于您获得的内容量以及用户可能滚动的方式。如果用户可能会费力地到达列表的底部,那么最初加载所有内容往往会更好。如果用户可能浏览缓慢,那么您通常可以在用户接近列表或网格底部时加载。【参考方案2】:去年在伦敦参加 DroidCon 时,一个演讲让我注意到为什么使用 AsyncTasks 从网络加载数据是不可靠的。
本次演讲是关于RoboSpice library。
该网站还有一个 very nice infographic 解释了为什么 AsyncTasks 不可靠以及 RoboSpice 为修正这些问题所做的工作。
免责声明: 我绝不隶属于 RoboSpice,也从未尝试过。他们的演示给我留下了深刻的印象并确信这是一个值得尝试的工具。
【讨论】:
【参考方案3】:朋友,我正在按照您的需要在一个项目中工作,并且要支持 API 8 及更高版本,您应该使用 Asynctask 下载任何内容,否则您将遇到 API 15 及更高版本的崩溃,因为它甚至不会让您即使是短期操作,也可以在没有 AsyncTask 的情况下运行您的应用。
因此,由于我几乎完成了您需要的所有操作,并且它在上面的 API 9 中运行良好,您应该使用 Asynctask,我已经使用 AsyncTask 实现了 SherlockActionbar、EndlessAdapter 和 ViewPager,所以继续,如果您需要更多帮助稍后再问。
【讨论】:
以上是关于Android AsyncTask 与特定情况下的线程的主要内容,如果未能解决你的问题,请参考以下文章