instagram android 是如何实现导航的?

How does instagram android implement the navigation?

我正在构建一个 Android 应用程序,其导航类似于 Instagram,它有多个选项卡,每个选项卡都有自己的历史记录。

实施

我通过使用 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) {

            }
        }

        ...

    }
}

大部分片段有 ListView、扩展名 BaseAdapter 和演示者。

问题

它似乎可以工作,但问题是当我在选项卡中向下导航时,出现 OOM 错误。 Instagram 如何保存(可能)无限数量的历史记录。

Allocation Tracker Result (Screenshot)

Heap Dump Result (Screenshot)

问题

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

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

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

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

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