2012-02-10 123 views
2

我遇到了我的GLSurfaceView问题。onPause()/ onResume()中的GLSurface问题

我的主要活动有一个TabLayout。我把GLSurfaceView这样的标签里面:

renderer = new GLRendererX(Interface.this); 
    cube3d = new GLSurfaceView(Interface.this); 
    cube3d.setRenderer(renderer); 
    cube3d.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 

    cube3d.setOnTouchListener(new OnTouch()); 

    cube3d_tab_content = (LinearLayout) findViewById(R.id.tab1_5); 
    cube3d_tab_content.addView(cube3d); 

根据Android的开发者指南,我必须调用的onPause()和的onResume()方法:

一个GLSurfaceView必须通知时该活动暂停并恢复。 GLSurfaceView客户端需要在活动暂停时调用onPause(),并在活动恢复时调用onResume()。这些调用允许GLSurfaceView暂停并恢复渲染线程,并允许GLSurfaceView释放并重新创建OpenGL显示。

Android Dev Guide

所以我insertet了的onResume()/的onPause()在我的主要活动的onResume()/的onPause()调用:

@Override 
protected void onPause() { 
    super.onPause(); 

    cube3d.onPause(); 
    //cube3d_tab_content.removeView(cube3d); 

    currentTab = th.getCurrentTabTag(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    cube3d.onResume(); 

    if (prefs != null) { 
     protocol.refresh(); 
    } 
    th.setCurrentTabByTag(currentTab); 

    cube.setFields(ffields, rfields, lfields, ufields, dfields, bfields); 

    cube.display(); 
} 

现在,当我打电话给另一项活动时(例如在菜单上)并返回(onResume)时,活动冻结了几秒钟,并且fina lly返回到我的主要活动。

为了确保问题只发生在GLSurfaceView上,我删除了有关GLSurfaceView的代码。它的工作原理应该如此。

所以我认为我的cube3d.onPause()/ .onResume()有问题。

有谁知道如何解决这个问题?

在此先感谢!

阿德里安

+0

我发现了一个可行的解决方案,但我不太确定这是否一个正确的方法来做到这一点。我只是将初始化GLSurfaceView的部分移到了onResume()。然后,当调用onPause()时: 'cube3d_tab_content.removeAllViews(); cube3d = null;' 这是安全吗? – aeduG 2012-02-10 21:21:17

回答

1

的两种方法称为主线程(UI线程):YourActivity.onPause/YourGLSurfaceView.onPause

的话,也许应该像这样YourGLSurfaceView.java:

public void onPause() { 
    queueEvent(new Runnable() { 
     @Override 
     public void run() { 
      3dcube.onPause(); 
     } 
    }); 

    super.onPause(); 
} 
+0

非常感谢。我花了近4个小时解决了这个问题。 – AlmostBearded 2013-07-03 21:22:00

0

你应该从onpausse onresume()方法注册/取消注册渲染器,它会很好地工作