>人们,我有一个异步任务,它使用网络服务下载一些新闻项目。这是为此的伪装.
我有一个在异步任务中执行的操作。它从网络服务下载一些新闻。
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
}
}
我的问题是,在操作过程中,如果设备是定向的,我们将有一个新的 同步任务 .现在已经在进行的旧有一个 内部列表 .
那会是垃圾收集吗? .我认为不会.我闻到了在这种情况下应用的弱引用的概念,但我不能相信我的鼻子。
同样通过弱引用,我可能在 onPostExecute 中知道产生此异步的活动不再存在。但。我仍然相信我错过了很多.
或者这没什么我应该担心的,一旦异步任务完成,列表将自动被垃圾回收?
您有一个新的AsyncTask
,因为活动是重新创建的,并且您可能正在onCreate | onStart | onResume中生成任务。
您可以在配置更改时禁用活动重新启动,但这很棘手。只需假设您的活动可能会重新启动,并实施它,以便可以安全地完成此操作。
由于您将上下文作为参数传递,因此我假设该任务是静态内部类或其自身文件中的外部类。
您可以尝试使用"应用程序"上下文而不是"活动"上下文,如本博客文章中所述:http://android-developers.blogspot.com.es/2009/01/avoiding-memory-leaks.html
另一种选择是,正如您所说,对上下文有一个弱引用。
但除此之外,这里重要的是这两个任务是否可以安全地同时运行。此外,当您知道结果不会被可见活动消耗时,运行任务直至完成也是浪费资源。我会在活动关闭时取消当前任务(onStop | onPause | onDestroy),但这也很棘手(您需要实现它以尽快取消它,线程被中断。更多信息在这里: Android - 强制取消异步任务)。
最健壮的方法是使用服务而不是AsyncTask。
有线程AsyncTask在概念上真的有缺陷,还是我只是错过了什么?
简而言之,从 MVC(模型-视图-控制器)的角度来看,活动是控制器,您的数据属于模型。因此,不要直接从活动调用此类 AsyncTasks。
再写一篇:AsyncTask Misstepshttp://www.shanekirk.com/2012/04/asynctask-missteps/