1

我正在三星 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 初始化(例如着色器编译)的最佳位置?

4

2 回答 2

0

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

渲染类中的代码:

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));
               }
        });
     }
}
于 2014-03-10T18:23:23.867 回答
0

您可以轻松地使用日志类获取调试信息

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

对于android ui组件,您必须制作一个处理程序来正确中断glthread,这就是您崩溃的原因,但我说使用日志,因为这将是最佳实践

于 2013-06-06T00:52:33.343 回答