2012-02-10 10 views
2

私のGLSurfaceViewに問題があります。onPause()/ onResume()のGLSurfaceに関する問題

主なアクティビティにはTabLayoutがあります。 、私はonPause()とonResume()メソッドを呼び出す必要がAndroidの開発者ガイドによると

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); 

:私はこのようなタブ内GLSurfaceViewを入れ

A GLSurfaceViewは、ときに通知しなければなりませんアクティビティが一時停止され、再開されます。 GLSurfaceViewクライアントは、アクティビティが一時停止したときにonPause()を呼び出し、アクティビティが再開したときにonResume()を呼び出す必要があります。これらの呼び出しにより、GLSurfaceViewはレンダリングスレッドを一時停止および再開できるほか、GLSurfaceViewがOpenGLディスプレイを解放して再作成できるようになります。

Android Dev Guide

だから私はonResume()/ onPause()が私の主な活動onResume()/ onPause()で呼び出しますinsertet:

@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()メソッドからレンダラーを登録/登録解除する必要があります。完全に動作します