ViewPager + SurfaceView = 导航回活动时的长时间延迟



基本上是标题所说的,

我的应用程序主要由使用FragmentStatePagerAdapterViewPager组成

当我将一系列SurfaceViews添加到 FragmentStatePagerAdapter 时,会出现此问题。只是出于测试目的,我没有以任何方式对SurfaceViews进行子类化。当我浏览几页,点击"主页",然后返回活动时,整个设备会冻结一两秒钟,然后渲染任何内容。我可以在从后退堆栈中拉出后恢复所需的时间内多次启动并完成()应用程序。我知道应用程序正在运行,因为在第一次屏幕绘制最终发生时,几个 AsyncTasks 几乎已经完成。我知道这些异步任务不会导致问题,因为我已经删除了它们,但没有效果。

当我更改 SurfaceView 以Views问题完全消失时。

当我使用实际的 SurfaceViews(对于我的项目来说是不可协商的)时,也会出现此问题。此问题也发生在多个设备上。

这一点上,我认为错误完全出在 ViewPager 上,但我不知道该怎么办,因为我需要那个界面组件。

任何帮助将不胜感激!

编辑:

为了澄清,SurfaceViews/Views 表示添加到 FragmentStatePagerAdapter 的片段视图。

为未来的谷歌员工找到了解决方案!

这是我是如何做到的:

在我的片段中,我在onCreate()中实例化了mySurfaceView

然后我在onCreateView()期间将虚拟布局(LinearLayout)附加到实际视图

然后在onResume()中,我用removeAllViews()清除了虚拟布局,然后调用addView(mySurfaceView)

这似乎允许ViewPager快速构建其布局,然后在用户实际需要看到任何东西之前弹出SurfaceView!

我发现的更好的解决方案是

  • 覆盖FragmentPageAdapter中的getItem()
  • 返回Fragment时,请使用Handler创建 2 秒的延迟

现在,每次您的 Fragment 页面适配器尝试返回SurfaceView它都会等待 2 秒或其他时间。Surface View将在那个时候启动。下面显示

fragmentAdapter extends FragmentPageAdapter

@Override
getItem(int position)

if (position == 0)
>     final Handler handler = new Handler();
>     handler.postDelayed(new Runnable() {
>         @Override
>         public void run() {
>             // initiate SurfaceView
>             // return fragment after 5s
>         }
>     }, 5000);

最新更新