我的GLSurfaceView出现问题。
我的主要活动有一个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显示。
所以我在主要活动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),活动冻结了几秒钟,最后返回到我的主要活动。
为确保仅在GLSurfaceView中出现问题,我删除了有关GLSurfaceView的代码。它按预期工作。
所以我认为我的cube3d.onPause()/ .onResume()出了问题。
有谁知道如何解决这个问题?
提前致谢!
阿德里安
答案 0 :(得分:1)
在主线程(UI线程)中调用这两个方法:YourActivity.onPause / YourGLSurfaceView.onPause
所以,也许在YourGLSurfaceView.java中应该这样:
public void onPause() {
queueEvent(new Runnable() {
@Override
public void run() {
3dcube.onPause();
}
});
super.onPause();
}
答案 1 :(得分:0)
您应该从onpausse onresume()方法注册/取消注册渲染器,它将完美地工作