Java 什么';对父活动使用static有什么不对?

Java 什么';对父活动使用static有什么不对?,java,android,static,Java,Android,Static,假设我有一个带有静态引用的父活动ParentHost: ParentHost extends FragmentActivity { static ParentHost parent_host; static ViewPager pager; 现在让我们使用如下引用: public class TestPage extends Fragment { button.setOnClickListener(new View.OnClickListene

假设我有一个带有静态引用的父活动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),但没有发现任何问题

此方法适用于父活动吗

面向未来读者:

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();
                }
            });
切换到
((ParentHost)getActivity())。whatever()
,是使用正在运行的类实例的适当方式。根据Gabe的评论:

它之所以安全,是因为它保存在实例变量中,而不是 静止的因此,即使总是有一个引用,GC也可以 告诉他们,唯一提到它的是它的一个孩子,并且 整个链都可以进行GCed(这就是为什么java 使用标记和扫掠样式(GC而不是引用计数)

怎么了

好吧,我们就说你结束了这个活动。现在,任何实例级字段(非静态字段)都将超出范围并被垃圾收集

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

怎么了

好吧,我们就说你结束了这个活动。现在,任何实例级字段(非静态字段)都将超出范围并被垃圾收集


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

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

此外,这是一个内存泄漏。如果片段对其活动具有静态引用,则该活动将永远不会被清除。这意味着它所持有的任何物体都不会被清洗。这意味着它的所有视图、位图和内存结构都会杀死你的RAM


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

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

此外,这是一个内存泄漏。如果片段对其活动具有静态引用,则该活动将永远不会被清除。这意味着它所持有的任何物体都不会被清洗。这意味着它的所有视图、位图和内存结构都会杀死你的RAM


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

您根本不需要静态引用。这样做

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

您根本不需要静态引用。这样做

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

所以静态引用为ViewPager-pager;如果我们再次打开该活动,它不会被重用并分配给新的活动吗?如果对该静态引用执行:.finish()操作会怎么样?这会得到GC'd吗?@Petro-No。完成一个活动和卸载类加载器是两种不同的方法things@Petro想一想对Android说的
finish()
“关闭此活动,我就完成了。做你想做的任何事情”。不管你想要什么,都可以释放它进行垃圾收集,但是正如其他人所指出的,静态引用将阻止活动在卸载类之前被GCed;如果我们再次打开该活动,它不会被重用并分配给新的活动吗?如果对该静态引用执行:.finish()操作会怎么样?这会得到GC'd吗?@Petro-No。完成一个活动和卸载类加载器是两种不同的方法things@Petro想一想对Android说的
finish()
“关闭此活动,我就完成了。做你想做的任何事情”。不管您想要什么,都可以将其释放以进行垃圾收集,但正如其他人所指出的,静态引用将阻止活动被GCed,直到卸载该类。如果您对该静态引用执行:.finish()操作,该怎么办?该静态引用是否得到GC'd?否。Finish不会导致垃圾收集,它只是将对象置于不再作为上下文有效的状态。只要有引用,它可能不会被垃圾收集。哦,好吧,这就是我想知道的,你能把它添加到你的答案中,这样我就可以标记它吗?谢谢另外,((ParentHost)getActivity())。来自@Alireza注释的任何()都是安全的?getActivity是安全的。它之所以安全,是因为它保存在实例变量中,而不是静态变量中。因此,即使总是有一个对它的引用,GC也能判断出对它的唯一引用是由它的一个子元素持有的,并且整个链都可以进行GCed(这样做的能力就是为什么java使用标记和扫描样式GC而不是引用计数)。如果对该静态引用执行:.finish()会怎么样?该静态引用是否得到GC'd?否。Finish不会导致垃圾收集,它只是将对象置于不再作为上下文有效的状态。只要有引用,它可能不会被垃圾收集。哦,好吧,这就是我想知道的,你能把它添加到你的答案中,这样我就可以标记它吗?谢谢另外,((ParentHost)getActivity())。来自@Alireza注释的任何()都是安全的?getActivity是安全的。它之所以安全,是因为它保存在实例变量中,而不是静态变量中。因此,即使总是有一个对它的引用,GC也能判断出对它的唯一引用是由它的一个子节点持有的,并且整个链都可以被GCed(这样做的能力就是为什么java使用标记和扫描样式的GC而不是引用计数)。当活动未打开时,它仍然不能被垃圾收集。(因为静态字段引用它)当活动未打开时,仍然无法对其进行垃圾收集。(因为静态字段正在引用它)