我读到,保留带有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;
}
}
在这里,您保留了对旧活动的mLogin,mPassword和ImageView视图的引用,但是它们在旋转后立即被覆盖,因为将调用onCreateView(),因此,如果您的活动是前端活动,并且发生配置更改,则应该没事。
但是,如果您的活动不是前台活动,那么您可能会遇到内存泄漏,并且通常您不知道片段的处理方式。
例如,ViewPager有2种不同的适配器,其中一种(http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html)保留Fragment实例(仅调用onDestroyView()),而其他(FragmentStatePagerAdapter)正在销毁片段实例。
因此,如果从FragmentPagerAdapter中使用,您的片段将泄漏大量内存。
我希望这可以作为潜在问题的例子。如果您知道自己在做什么,那么调用setRetaineInstance(true)并不处理视图就没有问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句