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中很典型,導致內存泄漏的可能性小得多。