将static用于父活动有什么问题?

时间:2015-03-21 05:38:56

标签: java android static

假设我有一个带有静态引用的父活动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而不是引用计数)

3 个答案:

答案 0 :(得分:3)

嗯,你不需要它。片段可以通过调用getActivity()获得其活动。

另外,它的内存泄漏。如果Fragment具有对其活动的静态引用,则永远不会清除该Activity。这意味着它所拥有的任何物体永远不会被清理。这意味着它的所有视图,位图和内存结构都会破坏你的RAM。

所以这是一个非常糟糕的主意,并没有给你任何好处。你为什么要这样做?

答案 1 :(得分:2)

出了什么问题?

好吧,我们只是说你关闭了这项活动。现在,任何实例级别字段(非静态字段)都将超出范围并被垃圾回收。

但是在 static 字段的情况下,实例会一直存在并且将一直存在,直到类获得GCed(这在类加载器获得GCed时发生)。因此,对于小部件使用静态o占用大量内存的对象不建议

答案 2 :(得分:2)

您根本不需要静态参考。这样做

((ParentHost) getActivity()).whatever()