我已经在 Android 中制作了一些应用程序,并注意到我经常使用静态方法。
例如我有一个类扩展PreferenceFragment
。在此 PreferenceFragment 中我设置了一个onClick
事件在Button
.
Button btn = new Button(getActivity().getApplicationContext());
btn.setText("Save");
v.addView(btn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SettingsActivity.finishActivityWithResultOkey();
}
});
然后我在我的中调用静态方法SettingsActivity
这完成了这个Activity
。这是做我想做的事情的好方法吗?或者有更好的解决方案吗?
在 Android 中(更准确地说是在 Java 等内存管理编程语言中),static
如果使用不当,方法可能会导致“内存泄漏”。我引用了“内存泄漏”,因为它们不是内存泄漏的纯粹定义,就像在 C++ 中一样,您忘记从内存中删除一些项目并丢失对它们的引用(因此以后无法清除它们 - 至少不容易清除) ),但更像是在您不再需要引用时继续保留它们,并阻止 GC 完成为您清除内存的工作。网络上有很多文章介绍了这一点(搜索“Android 静态内存泄漏”)以及许多关于 SO 的其他问题(请参阅[静态][Android][内存泄漏] 标签),所以我不会讨论这个。
对于您的特定情况,为了避免可能的内存泄漏,您可以获得Activity
来自Fragment
反对你的匿名OnClickListener
对象通过使用绑定到MyFragmentClass.this.getActivity()
,将其投射到,比如说,SettingsActivity
(就像这里的情况一样)并打电话.finishActivityWithResultOkey()
在上面。最好你也保护你的演员。
下面是代码的示例:
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final Activity activity = MyFragmentClass.this.getActivity();
if(activity instanceof SettingsActivity)
((SettingsActivity)activity).finishActivityWithResultOkey();
else
throw new IllegalStateException("This OnClickListener requires a SettingsActivity to start the fragment containig it"); //helps with debugging
}
});
作为注释:MyFragmentClass
指的是您将此代码放入的片段的类:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)