Android AsyncTask与特定情况下的线程

Android AsyncTask与特定情况下的线程,android,multithreading,android-asynctask,android-compatibility,Android,Multithreading,Android Asynctask,Android Compatibility,我正在开发一个类似于Google Play应用程序的应用程序(在片段中使用gridview滑动视图,另外gridview[图像+文本]中的数据是从远程服务器检索的) 我的问题是背景任务。我不能决定用什么从互联网上检索数据。我主要是想决定是使用AsyncTask还是手动线程。 当然,实现AsyncTask会更容易,但经过一些研究,我注意到许多人发现它有局限性 在我的特殊情况下,我想从internet下载数据作为Json对象,解析它们并在gridview中显示数据。gridview最多有30个项目,

我正在开发一个类似于Google Play应用程序的应用程序(在片段中使用gridview滑动视图,另外gridview[图像+文本]中的数据是从远程服务器检索的)

我的问题是背景任务。我不能决定用什么从互联网上检索数据。我主要是想决定是使用AsyncTask还是手动线程。 当然,实现AsyncTask会更容易,但经过一些研究,我注意到许多人发现它有局限性

在我的特殊情况下,我想从internet下载数据作为Json对象,解析它们并在gridview中显示数据。gridview最多有30个项目,每个项目包含一个缩略图和3个文本视图。在Android文档中,他们说AsyncTask适合于短操作(最多几秒钟)。填充多达30个项目会被视为短期操作吗? 我希望同时获取数据。我还想支持API 8及以上版本的Android手机。我了解到,对于不同的API,AsyncTask的行为不同(串行或并发)

我的问题是:我的应用程序是否适合使用AsyncTask?还是我必须手动完成所有工作?ThreadPoolExecutor是第三种方法吗?这比手动穿线容易吗

如果您有任何建议,我将不胜感激。如果不就这个问题做出决定,我将无法推进实施


提前谢谢

朋友,我正按照您的需要在一个项目中工作,为了支持API 8及以上版本,您应该使用Asynctask下载任何内容,否则API 15及以上版本会崩溃,因为它甚至不允许您在没有Asynctask的情况下运行应用程序,即使是短期操作


因此,由于我几乎完成了您需要的所有操作,而且它在上面的API 9中运行得非常好,所以您应该使用Asynctask,我已经用Asynctask实现了SherlockActionbar、EndlesAdapter和ViewPager,所以请继续,如果您需要更多帮助,请稍后再询问。

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

下载和处理数据可能是最长的操作。所以我会用它作为判断这是短还是长的基础。如果您根本不关心数据的持久性,也不介意在用户离开或回来时重新启动下载,那么您可以不费吹灰之力就使用AsyncTask

如果您使用的是GridView,则一次只能填充足够的视图,使其刚好超过屏幕上显示的数字

我认为AsyncTask在您的情况下很好,假设它是几KB的数据,而不是兆字节或数百KB。海量数据,我想说的是移动到一个有线程的服务。数百k,是一个掷硬币

另外,看看装载机。。。如果您希望看到一种更适合这种加载方式的替代方案。

去年在伦敦参加会议时,我注意到了一个演示,为什么使用AsyncTasks从网络加载数据是不可靠的

这次演讲是关于

该网站还解释了为什么异步任务不可靠,以及RoboSpice如何解决这些问题

免责声明:
我与机器人世界一点关系都没有,我也从未尝试过。他们的演示给我留下了深刻的印象,让我相信这是一个值得尝试的工具。

AsyncTask对此不可靠,线程级别太低。考虑使用加载器:谢谢佐尔坦,链接非常有用!请参阅我的答案,以便为您的问题提供更简洁的解决方案。谢谢您的富有洞察力的回答!然而,你指出了一件我还没有想到的关于GridView人口的事情。我明白你的意思,但这是否意味着当用户向下滚动时,我应该与远程服务器建立另一个连接?或者让他们准备好,如果用户向下滚动,我会填充屏幕上现在显示的项目?再次感谢!这实际上取决于你的内容量以及用户可能滚动的方式。如果一个用户可能很难找到列表的底部,那么在开始加载所有内容时效果会更好。如果用户可能浏览速度较慢,则通常可以在用户接近列表或网格底部时加载。