Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于内部列表的异步任务优化_Java_Android_Android Asynctask_Weak References - Fatal编程技术网

Java 关于内部列表的异步任务优化

Java 关于内部列表的异步任务优化,java,android,android-asynctask,weak-references,Java,Android,Android Asynctask,Weak References,各位,我有一个异步任务,它使用Web服务下载一些新闻条目。这是我的假药 我有一个在异步任务中执行的操作。它从Web服务下载一些新闻 AsyncTask { AsyncTask(Context context){} doInBackground() { // download some news .. .. return List<News> } onpostExecute(List <News>) { is the activity around ? if

各位,我有一个异步任务,它使用Web服务下载一些新闻条目。这是我的假药

我有一个在异步任务中执行的操作。它从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
}

}
异步任务
{
异步任务(上下文){}
doInBackground()
{
//下载一些新闻
..
..
返回列表
}
onpostExecute(列表)
{
活动是否进行?如果是,则
//使用上下文查找列表,并用新闻填充它
}
}
我的问题是,在操作过程中,如果设备是定向的,我们将有一个新的异步任务。现在,已经在进行的旧版本有一个内部列表

那会是垃圾收集吗。我想不会的。我闻到在这种情况下使用weakreferences的概念,但我不能相信我的鼻子

同样通过WeakReference,我可能在onPostExecute内部知道产生此异步的活动已经不存在了。但是我仍然相信我错过了很多


或者这没什么我应该担心的,一旦任务完成,列表就会自动被垃圾收集

您有一个新的
AsyncTask
,因为活动已重新创建,并且您可能正在onCreate | onStart | onResume中生成任务

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

由于您将上下文作为参数传递,因此我假设该任务是一个静态的内部类或其自身文件中的外部类

您可以尝试使用“应用程序”上下文而不是“活动”上下文,如本文所建议的:

另一个选择是,正如你所说的,对上下文进行弱引用

但除此之外,重要的是这两个任务是否可以同时安全运行。当您知道结果不会被可见活动消耗时,运行任务直到完成也是一种资源浪费。我会在活动关闭时取消当前任务(onStop | onPause | onDestroy),但这也很棘手(您需要实现它,以便在线程中断时立即取消它。此处的详细信息:)

最可靠的方法是使用服务而不是异步任务。

有线程

简而言之,从MVC(模型-视图-控制器)的角度来看,活动是一个控制器,您的数据属于模型。所以不要直接从活动中调用这样的异步任务

再写一篇:异步任务失误

谢谢您的回复。但是,正如您所看到的,我的问题更多地与垃圾收集器的行为有关。我的意思是,我目前没有任何问题,但我强烈希望,正如我在问题中暗示的那样,我将来可能会有一个问题。我认为,就记忆而言,更昂贵的对象是活动上下文。列表,您应该在asynctask类中声明它,因此如果任务被收集,它也会被收集。