繁体   English   中英

这种情况会导致内存泄漏吗?

[英]Does this situation cause Memory Leak?

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

正如您将看到的那样,我在FoldActivity中设置了“ OnItemSelectedListener”,然后在FoldFragment中实现了“ ItemSelectedListener”,因此该片段始终监视侦听器,我担心当替换一个片段时,该片段可以被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");
    }
}

您不必担心通过setOnItemSelectedListener方法将片段添加为侦听器来泄漏引用。 如您在源代码中所看到 ,此方法将对原始侦听器的引用覆盖,这将删除该引用。 这是android api设计的一个不错的方面:例如, 设置一个侦听器而不是添加一个侦听器(例如,在Swing中是典型的),这样就不太可能导致内存泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM