Почему рекомендуется не сохранять фрагмент с пользовательским интерфейсом?

Я читал, что сохраняющий фрагмент с ui и ссылки на представления могут вызвать утечку памяти. Затем я создаю тестовое приложение с фрагментом, где храню некоторые ссылки на представления и устанавливаю setRetaineInstance (true), но несколько поворота экрана не вызывают никаких утечек. MAT говорит, что у меня есть только один экземпляр родительской активности. Что я делаю неправильно? В каких случаях сохранение фрагмента с ui может привести к утечкам?

RetainInstanceActivity.java

public class RetainInstanceActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(android.R.id.content, RetainFragment.newInstance()) .commit(); } }} 

RetainFragment.java

 public class RetainFragment extends Fragment { private View mLogin; private View mPassword; private View ImageView; public static RetainFragment newInstance() { final RetainFragment fragment = new RetainFragment(); return fragment; } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_retain, container, false); mLogin = view.findViewById(R.id.login); mPassword = view.findViewById(R.id.password); ImageView = view.findViewById(R.id.img); return view; } 

}

Solutions Collecting From Web of "Почему рекомендуется не сохранять фрагмент с пользовательским интерфейсом?"

Здесь вы сохраняете ссылки на представления mLogin, mPassword и ImageView старой активности, но они перезаписываются сразу после ротации, так как будет вызываться onCreateView (), поэтому, если ваша деятельность является фронтовой деятельностью и происходит изменение конфигурации, все должно быть хорошо.

Вы можете столкнуться с утечками памяти, если, если ваша деятельность не является основной деятельностью, и, в общем, вы не можете знать, как обрабатывается ваш фрагмент.

Например, ViewPager имеет 2 разных адаптера: один ( http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html ) сохраняет экземпляры фрагмента (просто вызывает onDestroyView ()), в то время как Другой (FragmentStatePagerAdapter) уничтожает экземпляры фрагмента.

Таким образом, ваш фрагмент будет просачивать значительную память, если он используется из FragmentPagerAdapter.

Надеюсь, это послужит примером потенциальных проблем. Если вы знаете, что делаете, то нет проблем с вызовом setRetaineInstance (true) и не удалять представления.