【问题标题】:Does this situation cause Memory Leak?这种情况会导致内存泄漏吗?
【发布时间】:2014-12-02 03:31:49
【问题描述】:

我正在写一个android项目,我写这些代码,我想知道我的代码是否会导致一些内存泄漏。

如你所见,我在FoldActivity中设置了“OnItemSelectedListener”,然后在FoldFragment中实现了“ItemSelectedListener”,所以fragment总是监听监听器,我担心当fragment被替换时,fragment能否被gc检索?

我认为片段总是有来自 foldActivity 的引用,这导致 gc 永远无法检索它,即使它已被其他片段替换。

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");
    }
}

【问题讨论】:

    标签: java android android-fragments memory-leaks garbage-collection


    【解决方案1】:

    您不必担心通过setOnItemSelectedListener 方法将片段添加为侦听器来泄漏引用。正如您在the source 中看到的那样,此方法会覆盖对原始侦听器的引用,这将删除该引用。这是 android api 设计的一个很好的方面:设置一个监听器而不是添加一个监听器,例如在 Swing 中是典型的,它不太可能导致内存泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多