0

伙计们,我有一个异步任务,它使用网络服务下载一些新闻项目。这是 psuedo 。

我有一个在 asynctask 中执行的操作。它从网络服务下载一些新闻。

AsyncTask
{

AsyncTask(Context context){}

doInBackground()
{
 // download some news 
 ..
..
 return List<News>
}

onpostExecute(List <News>)
{
 is the activity around ? if yes then
  //find the list using context ,and populate it with news
}

}

我的问题是,在操作过程中,如果设备是定向的,我们将有一个新的 AsyncTask。现在已经在进行中的旧版本有一个内部 List 。

那会是垃圾收集吗?. 我认为不会。我闻到了在这种情况下应用弱引用的概念,但我不能相信我的鼻子。

同样通过弱引用,我可能知道在 onPostExecute 内部产生此 Async 的活动不再存在。但 。我仍然相信我错过了很多。

或者这不是我应该担心的,一旦异步任务完成,列表会自动被垃圾收集?

4

2 回答 2

0

有线程 AsyncTask 在概念上真的有缺陷还是我只是错过了什么?

简而言之,从MVC(Model-View-Controller)的角度来看, Activity 是一个Controller,并且您的数据属于Model。所以不要直接从 Activity 调用这样的 AsyncTasks。

再写一篇:AsyncTask Missteps http://www.shanekirk.com/2012/04/asynctask-missteps/

于 2013-11-11T11:05:52.100 回答
0

您有一个新AsyncTask的,因为重新创建了活动,并且您可能在 onCreate | 中产生了任务。开始 | 继续。

您可以在配置更改时禁用活动重启,但这很棘手。假设您的活动可能会重新启动,并实施它以便可以安全地完成。

由于您将上下文作为参数传递,我假设该任务是静态内部类或它自己文件中的外部类。

您可以尝试使用“应用程序”上下文而不是“活动”上下文,如此博客文章中所述: http ://android-developers.blogspot.com.es/2009/01/avoiding-memory-leaks.html

正如您所说,另一个选项是对上下文有一个弱引用。

但除此之外,这里重要的是这两个任务是否可以安全地同时运行。当您知道结果不会被可见活动消耗时,将任务运行到完成也是一种资源浪费。当活动关闭时,我会取消当前任务(onStop | onPause | onDestroy),但这也很棘手(您需要实现它以尽快取消它,线程被中断。更多信息在这里:Android -强制取消 AsyncTask)。

最可靠的方法是使用 Service 而不是 AsyncTask。

于 2013-11-11T10:54:43.660 回答