gpt4 book ai didi

android - 为什么建议不要保留带有 UI 的 fragment ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:28 28 4
gpt4 key购买 nike

我读到保留带有 ui 的 fragment 和对 View 的引用会导致内存泄漏。比起我用 fragment 创建测试应用程序,我在其中存储了一些对 View 的引用并设置了 setRetaineInstance(true),但是多次屏幕旋转不会导致任何泄漏。 MAT 说我只有一个父 Activity 实例。我做错了什么?哪些情况下用ui保留fragment会导致泄露?

保留InstanceActivity.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();
}
}}

保留 fragment .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;
}

最佳答案

在这里您保留了对旧 Activity 的 mLogin、mPassword 和 ImageView View 的引用,但它们在旋转后立即被覆盖,因为将调用 onCreateView(),因此如果您的 Activity 是前端 Activity 并且发生配置更改,您应该没事。

但是,如果您的 Activity 不是前端 Activity ,您可能会遇到内存泄漏,而且通常您无法知道您的 fragment 是如何处理的。

例如,ViewPager 有 2 个不同的适配器,一个 (http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html) 保留 Fragment 实例(仅调用 onDestroyView()),而另一个 (FragmentStatePagerAdapter) 正在销毁 fragment 实例。

因此,如果从 FragmentPagerAdapter 使用,您的 fragment 将泄漏大量内存。

我希望这可以作为潜在问题的一个例子。如果您知道自己在做什么,那么调用 setRetaineInstance(true) 而不处理 View 就没有问题。

关于android - 为什么建议不要保留带有 UI 的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18670364/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com