我正在编写一个android项目,我编写了这些代码,我想知道我的代码是否会导致一些内存泄漏。
正如你所看到的,我在FoldActivity中设置了“OnItemSelectedListener”,然后我在FoldFragment中实现了“ItemSelectedListener”,因此 fragment 始终监听监听器,我担心当 fragment 被替换时, fragment 是否可以被gc检索?
我认为该 fragment 始终具有来自foldActivity的引用,这导致gc永远无法检索它,即使它已被其他 fragment 替换。
public class FolderActivity extends Activity {
// ...
Spinner spinner;
protected void onCreate(Bundle savedInstanceState) {
// ...
final View spinnerView = inflater.inflater(R.layout.category_spinner, null);
spinner = spinnerView.findViewById(R.id.categorySpinner);
// ...
}
protected void onPostCreate(Bundle savedInstanceState) {
// ...
if (getFragmentManager.findFragmentById(R.id.fragment) == null) {
Fragment folderFragment = new folderFragment();
if (getIntent().hasExtra(EXTRA_DIR)) {
Bundle args = new Bundle();
args.putString(FolderFragment.EXTRA_DIR, getIntent().getStringExtra(EXTRA_DIR));
folderFragment.setArguments(args);
}
}
showFragment(folderFragment);
}
public void showFragment(Fragment fragment) {
spinner.setOnItemSelectedListener((folderFragment)fragment);
getFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.fragment, fragment)
.commit();
}
}
public class FoldFragment extends Fragment implements AdapterView.OnItemSelectedListener {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(LOG_TAG, "item selected");
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
Log.d(LOG_TAG, "nothing selected");
}
}
最佳答案
通过 setOnItemSelectedListener
方法将 fragment 添加为监听器,您不必担心泄漏引用。正如您在 the source 中看到的那样,此方法会覆盖对原始监听器的引用,这将删除该引用。这是 Android api 设计的一个很好的方面:设置一个监听器,而不是添加一个监听器(例如在 Swing 中典型的情况),不太可能导致内存丢失泄漏。
关于java - 这种情况会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27241392/