内存问题 - 碎片

时间:2012-04-02 21:27:06

标签: android memory-management memory-leaks android-fragments

我最近重构了一个应用程序,并将一个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;
}

但记忆力不断增长。

任何人都知道任何解决方案?也许重用片段?有效地摧毁它?我在听。

1 个答案:

答案 0 :(得分:6)

我忘记了我最初从中提取此代码的stackoverflow问题,但是一种似乎运行良好的方法是覆盖onAttachFragment的{​​{1}},然后将FragmentActivity存储到每个传入的片段。然后,您不再使用FragmentTransaction的replace方法,而是回收所有片段(与案例相关)。

这是FragmentActivity上的其他成员和方法的示例,它在WeakReference中创建默认片段并通过onCreate响应更改:

onNewIntent

现在,如果您监控堆,您应该注意到它的大小并没有变大。当您拥有包含位图的嵌套片段时,这种解决方案大多会发挥作用,这些位图由于某种原因似乎无法正确回收。我喜欢更优雅的解决方案,但这个有效。