我已经在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
。这是做我想做的好方法吗?或者有更好的解决方案吗?
答案 0 :(得分:3)
您可以使用称为镜像的Java属性。 下面我使用该属性来完成活动。
Button btn = new Button(getActivity().getApplicationContext());
btn.setText("Save");
v.addView(btn);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
SettingsFragment.this.getActivity().finish();
}
});
答案 1 :(得分:2)
在Android中(更准确地说,在Java等内存管理编程语言中),static
方法可能导致内存泄漏"如果使用不当。我引用了内存泄漏"因为它们不是内存泄漏的纯粹定义,就像在C ++中你忘记从内存中删除一些项目并丢失对它们的引用(因此以后无法清除它们 - 至少不容易),但更像是继续当您不再需要它们并阻止GC为您清除该内存时所做的工作。网上有很多文章涉及这个(搜索" Android静态内存泄漏")以及关于此问题的很多其他问题(参见[static][Android][memory-leaks] tags),所以我不会进入这个。
对于您的特定情况,为了避免可能的内存泄漏,您可以使用{{1从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
}
});
指的是您将此代码放入的片段类:)