我最近重构了一个应用程序,并将一个ViewFlipper替换为我在Fragments之间交换的FrameLayout。
每次用户请求其中一个视图时:
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();
}
我创建了一个新片段并替换旧片段。从屏幕上删除的那些调用onDestroy,但是我在屏幕上加载的位图消耗的内存不会被删除,因此应用程序在片段之间进行一些交换后崩溃。
我还尝试删除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;
}
但记忆力不断增长。
任何人都知道任何解决方案?也许重用片段?有效地摧毁它?我在听。
答案 0 :(得分:6)
我忘记了我最初从中提取此代码的stackoverflow问题,但是一种似乎运行良好的方法是覆盖onAttachFragment
的{{1}},然后将FragmentActivity
存储到每个传入的片段。然后,您不再使用FragmentTransaction的replace方法,而是回收所有片段(与案例相关)。
这是FragmentActivity上的其他成员和方法的示例,它在WeakReference
中创建默认片段并通过onCreate
响应更改:
onNewIntent
现在,如果您监控堆,您应该注意到它的大小并没有变大。当您拥有包含位图的嵌套片段时,这种解决方案大多会发挥作用,这些位图由于某种原因似乎无法正确回收。我喜欢更优雅的解决方案,但这个有效。