0

我正在写一个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"); 
    } 
} 

回答

2

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