在GL中将消息从GLSurfaceView传递到MainActivity的最佳做法?

时间:2013-06-06 00:37:10

标签: android opengl-es

我正在三星Galaxy Nexus上使用Android进行一些OpenGL ES 2.0编码。

我已根据Android OpenGL教程实现了MyRenderer类,但我希望能够将一些调试信息返回给MainActivity,例如,如果着色器编译器失败,则会显示错误消息。不幸的是,到目前为止,我尝试将错误消息重新发送回主要活动的所有方法都失败了。

首先,我只是让渲染类本身使用AlertDialogBu​​ilder类弹出一个警告对话框,但由于GLSurfaceView.renderer不是正确的类型,这显然不起作用。由于GLSurfaceView.renderer不是一个活动,我也无法生成一个活动来显示信息。

我的方法是让我的MainActivity实现一个名为AlertReporter的接口,该接口只有一个方法:

public interface AlertCallback {
    void alertAndDie(String alertString);    
}

我已经在我的MainActivity中实现了该方法,但只要我有方法做任何事情(生成警告框,创建新的文本框活动等等),程序就会崩溃。我假设(并且可能是错的)这是因为我在渲染线程中调用MainActivity中的方法(GLSurfaceView在创建渲染器时会产生这种方法)。

长话短说,我的问题是: 将此错误信息反馈回MainActivity线程以便我可以显示它的最佳做法是什么?

作为一个附带问题,渲染器中的onCreateSurface方法是否是处理所有openGL初始化(例如着色器编译)的最佳位置?

2 个答案:

答案 0 :(得分:0)

您可以轻松使用日志类来调试信息

Log.d("FPSCounter", "fps: " + frames);

对于android ui组件,你必须使用一个处理程序来正确地中断glthread这就是你崩溃的原因,我说使用日志,因为这是最好的做法

答案 1 :(得分:0)

这是我用来做类似事情的方法。我使用全局变量来保存在Activity类中创建的TextView的句柄。通过从Activity类调用render类来分配全局。

渲染类中的代码:

private static TextView glbTv1 = null;

public void assignTextviewGlobalHandles(TextView tv1){
    glbTv1 = tv1;

}

public void mycallbacktomainactivitymehod(){

     if(glbTv1 !=null){
       final myMainActivity activity=(myMainActivity) this.context;
       activity.runOnUiThread(new Runnable() {
          public void run()
               {
                 //glbTv1 is assigned through a TextView varaible created in the Activity class, by making a call into the render class.
                 glbTv1.setText(String.valueOf(f_jetPos));
               }
        });
     }
}