对包含AyncTask的自定义类的Android软引用
我刚刚开始在片段实现中使用SoftReference,它将setRetainInstance设置为True,我有一个关于..的问题 概述:对包含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
我正在做的是创建一个软引用列表,以便能够运行多个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,但对于其他内容,我将实现所有功能。如果可以的话,我将暂时不回答这个问题,以防将来有人需要答案(对类的引用是否与对异步本身的引用不同)