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

时间:2012-07-06 05:01:17

标签: android android-viewpager android-view

基本上标题是什么,

我的申请主要包含使用ViewPager

FragmentStatePagerAdapter

当我向FragmentStatePagerAdapter添加一系列SurfaceViews时,会出现问题。 仅出于测试目的,我没有以任何方式继承SurfaceViews。 当我浏览几页时,点击“home”,然后返回活动,整个设备在渲染任何内容之前冻结一两秒钟。我可以在从背包中取出后恢复所需的时间几次启动并完成()应用程序。我知道应用程序正在运行,因为在第一次screendraw最终发生时,几个AsyncTasks几乎已经完成了。我知道这些AsyncTasks不会导致问题,因为我已将它们删除无效。

当我将SurfaceViews更改为Views时,问题就完全消失了。

当我使用我的实际SurfaceViews(我的项目不可协商)时,会出现此问题。多个设备上也会出现此问题。

此时我认为错误完全在于ViewPager,但我不知道该怎么办,因为我需要那个接口组件。

非常感谢任何帮助!

编辑:

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

2 个答案:

答案 0 :(得分:5)

找到任何未来googlers的解决方案!

继承人我是怎么做到的:

在我的片段中,我在onCreate()

中实例化了mySurfaceView

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

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

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

答案 1 :(得分:0)

我找到的更好的解决方案是

  • 覆盖getItem()
  • 中的FragmentPageAdapter
  • 返回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);