2012-02-10 2 views
2

У меня проблемы с моим GLSurfaceView.Проблемы с GLSurface в onPause()/onResume()

Моей основной деятельностью является 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), активность замерзает на пару секунд и заканчивается lly возвращается к моей основной деятельности.

Чтобы убедиться, что проблема возникает только с GLSurfaceView, я удалил код, относящийся к GLSurfaceView. Он работал так, как должен.

Так что я предполагаю, что что-то не так с моим cube3d.onPause()/.onResume().

Кто-нибудь знает, как это исправить?

Заранее благодарен!

Адриан

+0

Я нашел решение, которое работает, но я не уверен, правильный способ сделать это. Я просто переместил часть, где я инициализирую GLSurfaceView до onResume(). И затем, когда вызывается onPause(): 'cube3d_tab_content.removeAllViews(); cube3d = null; ' Безопасно это или нет? – aeduG

ответ

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

0

Вам необходимо зарегистрировать/удалить регистратор из метода onpausse onresume(), и он будет работать отлично