【问题标题】:Android Effective Navigation Example . The Fragment is created multiple timesAndroid 有效导航示例。片段被多次创建
【发布时间】:2015-05-04 07:25:25
【问题描述】:

我正在玩 Android 的标准有效导航示例,它展示了如何创建可滑动的视图

代码可以从以下页面下载: http://developer.android.com/training/implementing-navigation/lateral.html

在 getView() 方法中,创建了一个新片段。这不是一个不好的做法,不会导致内存泄漏。

public Fragment getItem(int i) {

    switch (i) {

        case 0:
            // The first section of the app is the most interesting -- it offers
            // a launchpad into the other demonstrations in this example application.
            return new LaunchpadSectionFragment();

        default:
            // The other sections of the app are dummy placeholders.
            Fragment fragment = new DummySectionFragment();
            Bundle args = new Bundle();
            args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, i + 1);
            fragment.setArguments(args);
            return fragment;
    }
}

【问题讨论】:

  • 这里的内存泄漏是什么意思?
  • 每次都会在 getView() 中创建一个新的 Fragment 实例。我可以在调试器中看到 DummySectionFragments 正在获取新的 id。

标签: android android-fragments android-actionbar android-viewpager


【解决方案1】:

如果您仔细阅读 Viewpager 文档,它会为其提供两个适配器 内容:

来自 Android 开发者文档

FragmentPagerAdapter:

此版本的分页器最适合在需要分页浏览一些通常更静态的片段(例如一组选项卡)时使用。用户访问的每个页面的片段都将保存在内存中,尽管它的视图层次结构在不可见时可能会被破坏。这可能会导致使用大量内存,因为片段实例可以保持任意数量的状态。

FragmentStatePagerAdapter

当有大量页面时,此版本的寻呼机更有用,更像列表视图。当页面对用户不可见时,它们的整个片段可能会被销毁,只保留该片段的已保存状态。与 FragmentPagerAdapter 相比,这允许分页器保留与每个访问的页面相关联的内存更少,但代价是在页面之间切换时可能会增加更多开销。

如您所见,您可以根据自己的要求实现适配器,如果有大量数据,您可以实现 FragmentStatePagerAdapter,它负责处理片段的生命周期。

如果您不想动态创建片段,您可以在构造函数中实例化单个片段并使用不同的数据在 getview 上返回它

myFragment.setArguments(Bundle Instance);

【讨论】:

  • 我的用例是这样的:我有两个片段显示在两个不同的选项卡中。片段 1 显示一个列表,如果图像从不同的 url 动态获取并且用户可以将图像添加到他们的最喜欢的,并且 url 存储在数据库中。第二个选项卡是最喜欢的片段,它从数据库中读取 url 并在列表中显示图像。所以我需要的是,如果用户返回第一个选项卡并来到最喜欢的选项卡,它应该通知列表如果数据库中的数据发生更改。但是由于正在创建一个新的 Fragment ,所以我失去了列表适配器的引用
  • 您可以尝试 Viewpager.setOffscreenPageLimit (int numofrags) 来阻止片段被重新创建更多信息在这里(developer.android.com/reference/android/support/v4/view/…
  • 您可以尝试一个界面,每次用户在收藏夹列表中添加或删除数据时,您都可以使收藏夹选项卡中的数据无效,或者您可以在片段的 onresume 中重新获取数据,因为每个调用片段切换可见性 onpause 和 onresume 的时间。
  • 使用 View Pager 时不会触发 onResume()。到目前为止,我已经创建了一个模拟生命周期方法的接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多