假设我有一个带有静态引用的父活动ParentHost:
ParentHost extends FragmentActivity {
static ParentHost parent_host;
static ViewPager pager;
现在让我们使用类似的参考:
public class TestPage extends Fragment {
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//What's wrong with this?
ParentHost.pager.setCurrentItem(1);
or:
ParentHost.parent_host.finish();
}
});
我试过破坏我的应用程序(开始,暂停,杀死RAM),但我还没有看到任何问题。
此方法对父活动是否正常?
对于未来的读者:
切换到((ParentHost) getActivity()).whatever()
,是使用正在运行的类的实例的适当方法。来自Gabe的评论:
它安全的原因是它保存在一个实例变量而不是一个 静态的。因此,即使总是1引用它,GC也可以 告诉它唯一的参考是由它的一个孩子和 整个链都可以GCed(这样做的能力就是为什么java 使用标记和扫描样式GC而不是引用计数)
答案 0 :(得分:3)
嗯,你不需要它。片段可以通过调用getActivity()获得其活动。
另外,它的内存泄漏。如果Fragment具有对其活动的静态引用,则永远不会清除该Activity。这意味着它所拥有的任何物体永远不会被清理。这意味着它的所有视图,位图和内存结构都会破坏你的RAM。
所以这是一个非常糟糕的主意,并没有给你任何好处。你为什么要这样做?
答案 1 :(得分:2)
出了什么问题?
好吧,我们只是说你关闭了这项活动。现在,任何实例级别字段(非静态字段)都将超出范围并被垃圾回收。
但是在 static 字段的情况下,实例会一直存在并且将一直存在,直到类获得GCed(这在类加载器获得GCed时发生)。因此,对于小部件使用静态o占用大量内存的对象不建议。
答案 2 :(得分:2)
您根本不需要静态参考。这样做
((ParentHost) getActivity()).whatever()