对包含AyncTask的自定义类的Android软引用

对包含AyncTask的自定义类的Android软引用,android,android-fragments,android-asynctask,weak-references,Android,Android Fragments,Android Asynctask,Weak References,我刚刚开始在片段实现中使用SoftReference,它将setRetainInstance设置为True,我有一个关于..的问题 概述: 我正在做的是创建一个软引用列表,以便能够运行多个AsyncTask并保持引用。 但是,我的列表保留了对自定义类对象的引用,这些对象包装了一个异步任务,而不是一个异步任务本身 问题: SoftReference的行为会保持不变吗? Android还会“耦合”我的片段和所有那些异步任务吗,还是我错过了 这么做的整个想法 代码示例: public class my

我刚刚开始在片段实现中使用SoftReference,它将setRetainInstance设置为True,我有一个关于..的问题

概述:
我正在做的是创建一个软引用列表,以便能够运行多个AsyncTask并保持引用。 但是,我的列表保留了对自定义类对象的引用,这些对象包装了一个异步任务,而不是一个异步任务本身

问题:
SoftReference的行为会保持不变吗?
Android还会“耦合”我的片段和所有那些异步任务吗,还是我错过了
这么做的整个想法

代码示例:

public class myFragment extends Fragment{
    List<SoftReference<MyClass>> myList;
    ...
}

public class MyClass{
   private AsyncTask task;
   ...
}
公共类myFragment扩展了片段{
列出我的清单;
...
}
公共类MyClass{
私有异步任务;
...
}
编辑:在NKN评论WeakReference“太弱”后,我将问题改为软参考问题。谢谢你的夸奖。

但是问题仍然存在:)

如果我正确理解了您的想法,您希望拥有一个由您控制的
AsyncTask
实例数组。在这种情况下,由于它们可能是足够重要的数据,足以将它们存储到
SoftReference
中,并且由于垃圾收集器而危及它们的内容,因此我个人会更改
SoftReference
方法,以利用
AsyncTask
结构

我要声明
ArrayList
,但直接是
MyClass
实例(不是
SoftReferences
)。您可以在
MyClass
类中实现一个方法,如
setTaskId(int)
,在执行任何任务之前,您可以使用该实例的
ArrayList
中的索引调用该方法

然后调用
execute()
方法,一旦终止处理
AsyncTask
,就会调用
onPostExecute()
方法,从中调用
片段中的一个方法,表示
AsyncTask
的这个实例已经结束,您只需使用
yourarylist.delete(在该id上)

在您的问题中,您提到您这样做是为了有几个
异步任务
。您可以想做多少就做多少,但在这样做之前,因为
AsyncTask
execute()
方法在版本更改中发生了灾难性的更改,您可能需要使代码适应这些更改

---编辑---

Fragments
中使用
AsyncTask
s会带来额外的复杂性,当
AsyncTask
完成时,正如您所评论的,它可能已经被分离。因此,您必须实现额外的逻辑机制来检查它是否通过
isDetached()
连接。还要记住,
isDetached()
仅在明确分离
片段时有效,否则需要
isAdded()

您不需要一直使用它,只要记住
Fragment
生命周期,并在需要执行涉及附加
Fragment
的操作时调用它即可


为了简化一点,您可以将
AsyncTask
初始化和逻辑移动到父活动,因此如果分离
片段,它可能会正常工作(例如,如果片段不再附加,则丢弃结果,或者您需要的任何内容)。

在Android中使用
WeakReferences
时要非常小心。请记住,一个应用程序的最大内存为16MB,因此收集内存的频率要比普通Java框架高得多。我建议使用最少的
SoftReference
,并始终检查对象中可能释放的实例。谢谢!我现在正改为软参考。我真的知道并且忘记了呵呵。。此外,我还用try&catch包装了我所有的“get()”,以防引用丢失。非常感谢您的“阅读本文”,帮助很大!关于使用直接引用,这是否意味着当片段被分离时,这些异步任务将不会被垃圾收集?因为这就是为什么我首先使用SoftReference。。。工作的任务并不是那么重要。通常是一个GET请求,应该在片段分离时取消(我正在手动取消)。另外,我刚刚偶然发现了GoogleVolley,它在使用连接线程时应该表现得更好,所以我可能会继续使用它(这些任务通常应该从服务器加载内容)查看我的编辑,我在
Fragment
s中添加了一些关于使用
AsyncTask
s的说明。谢谢:)我现在了解了一些关于如何使用Fragment和async的更多信息。请注意,在处理互联网连接时,我正在将代码更改为使用GoogleVolley,但对于其他内容,我将实现所有功能。如果可以的话,我将暂时不回答这个问题,以防将来有人需要答案(对类的引用是否与对异步本身的引用不同)