【问题标题】:How does instagram android implement the navigation?instagram android是如何实现导航的?
【发布时间】:2017-01-02 13:21:04
【问题描述】:

我正在构建一个导航类似于 Instagram 的 Android 应用,它有多个标签,每个标签都有自己的历史记录。

实施

我通过使用ViewPagerFragmentPagerAdapter 实现了这个导航。向下导航每个选项卡时,我通过执行以下代码替换 FrameLayout 的内容 getChildFragmentManager.beginTransaction().addToBackStack(null).replace(R.id.container, newFragment).commit() 并为后退按钮按下事件执行getChildFragmentManager.popBackStackImmediate()

我使用 facebook fresco 的 SimpleDraweeView 并通过执行 SimpleDraweeView.setImageURI(Uri.parse(str)) 加载图像。

应用程序使用MapView 并创建自定义标记,其图标由Picasso.with(context).with(url).into(new MarkerTarget(...)) 创建

class MarkerTarget implements Target {
        private Marker marker;
        public MarkerTarget(Marker marker) {
            this.marker = marker;
        }

        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            try {
                marker.setIcon(BitmapDescriptorFactory.fromBitmap(bitmap));
                marker.setVisible(true);
            } catch(Exception e) {

            }
        }

        ...

    }
}

大部分片段都有ListViewBaseAdapter 的扩展和一个演示者。

问题

它似乎有效,但问题是当我在选项卡中向下导航时,发生 OOM 错误。 Instagram 如何保存(可能)无限数量的历史。

Allocation Tracker Result (Screenshot)

Heap Dump Result (Screenshot)

问题

如何在 Android 平台上实现类似 instagram 的导航?

【问题讨论】:

标签: android android-fragments instagram picasso fresco


【解决方案1】:

有多种方法可以做到这一点:

  1. 使用页面适配器,每个页面都可以被视为一个根片段,其中包含一堆子片段。
  2. 与上述类似,但不要使用适配器。使用多个根片段,这些片段在用​​户切换选项卡时被换出。

发生 OOM 错误的原因有很多。 1. 随着片段的堆积,每个片段都会保留一些数据。您可能希望保存状态并恢复数据以节省内存。 2. 使用页面适配器可能会导致这种情况,因为页面适配器可以使片段保持活动状态,即使它们当前不可见。

尝试运行您的应用并研究 HPROF 文件以获取内存使用情况的线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多