人们,我有一个异步任务,使用webservice下载一些新闻。这是伪造的。
我有一个在asynctask中执行的操作。它从Web服务下载一些新闻。
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。现在,旧的已经在进行中有一个内部列表。
这会被垃圾收集吗? 。我想不会。我闻到了在这种情况下应用弱点的概念,但我不能相信我的鼻子。
同样通过弱引用,我可能知道onPostExecute内部产生此异步的活动不再存在。但是。我仍然相信我错过了很多。
或者这是我应该担心什么,一旦asynctask结束,List会自动被垃圾收集?
答案 0 :(得分:0)
您有一个新的AsyncTask
因为重新创建了活动,并且您可能正在onCreate中生成任务。 onStart |的onResume。
您可以在配置更改时禁用活动重启,但这很棘手。假设您的活动可能会重新启动,并实施它以便安全地完成。
由于您将上下文作为参数传递,因此我假设该任务是静态内部类或其自己文件中的外部类。
您可以尝试使用“应用程序”上下文而不是“活动”上下文,如本博文中所述: http://android-developers.blogspot.com.es/2009/01/avoiding-memory-leaks.html
正如您所说,另一个选项是对上下文有一个WeakReference。
但除此之外,重要的是这两个任务是否可以安全地同时运行。当您知道结果不会被可见活动消耗时,也将任务运行完成是浪费资源。我会在活动关闭时取消当前任务(onStop | onPause | onDestroy),但这也很棘手(你需要实现它,目的是尽快取消它,线程中断。更多信息:{{ 3}})。
最强大的方法是使用服务而不是AsyncTask。
答案 1 :(得分:0)
有线索 Is AsyncTask really conceptually flawed or am I just missing something?
简而言之,Activity是 MVC(模型 - 视图 - 控制器)视点中的 Controller ,您的数据属于 Model 。所以不要直接从Activity调用这样的AsyncTasks。
再写一次: AsyncTask Missteps http://www.shanekirk.com/2012/04/asynctask-missteps/