gpt4 book ai didi

android - 内存问题 - fragment

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:06 25 4
gpt4 key购买 nike

我最近重构了一个应用程序并将 ViewFlipper 替换为我在 Fragment 之间交换的 FrameLayout。

每次用户请求其中一个 View 时:

    public void showLibraryOf(long publisherId) {
library = new DownloadLibraryFragment(id, viewFactory());

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.container, library);
ft.commit();

library.setAdapterObserver(this);
}

public void showMyLibraryOf(long publisherId) {
myLibrary = new MyLibraryFragment(id, viewFactory());

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.container, myLibrary);
ft.commit();
}

public void showHelp() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.container, new HelpFragment());
ft.commit();
}

我创建了一个新 fragment 并替换了旧 fragment 。那些从屏幕上移除的会调用 onDestroy,但我在屏幕上加载的位图消耗的内存不会被移除,因此应用程序在 fragment 之间进行一些交换后崩溃。

我还尝试在 onDestroy 中删除引用

@Override
public void onDestroyView() {
destroy();
super.onDestroyView();
adapter.clear();
adapter.clearObservers();
adapter.notifyDataSetChanged();

view.setAdapter(new ArrayAdapter<Journal>(getActivity(), 0));

adapter = null;
view = null;
}

但是内存一直在增长。

有人知道解决办法吗?也许重用 fragment ?有效地摧毁它?我在听。

最佳答案

我忘记了我最初是从哪个 stackoverflow 问题中提取这段代码的,但是一种似乎很有效的方法是覆盖 FragmentActivityonAttachFragment,然后存储一个 WeakReference 到传入的每个 fragment 。然后,不使用 FragmentTransaction 的 replace 方法,而是回收所有 fragment (与案例相关)。

下面是 FragmentActivity 的附加成员和方法示例,它在 onCreate 中创建默认 fragment 并通过 onNewIntent 响应更改:

private List<WeakReference<Fragment>> mFragments = 
new ArrayList<WeakReference<Fragment>>();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, MyFragment.newInstance("default"));
ft.commit();
}

@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
String section = intent.getStringExtra("section");
recycleFragments();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.fragment_container, MyFragment.newInstance(section));
ft.commit();
}

@Override
public void onAttachFragment(Fragment fragment) {
mFragments.add(new WeakReference<Fragment>(fragment));
}

private void recycleFragments() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

for (WeakReference<Fragment> ref : mFragments) {
Fragment fragment = ref.get();
if (fragment != null) {
ft.remove(fragment);
}
}

ft.commit();
}

现在,如果您监控堆,您应该会注意到它的大小没有爆炸。当您嵌套了包含位图的 fragment 时,由于某种原因似乎无法正确回收,此解决方案通常会发挥作用。我想要一个更优雅的解决方案,但这个可行。

关于android - 内存问题 - fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9984089/

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