Java 关于内部列表的异步任务优化
各位,我有一个异步任务,它使用Web服务下载一些新闻条目。这是我的假药 我有一个在异步任务中执行的操作。它从Web服务下载一些新闻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
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类中声明它,因此如果任务被收集,它也会被收集。