3

在我的 Android 应用程序中,我想从我的渲染器切换活动。当我创建渲染器时,我在构造函数中传递上下文。在我的渲染器中的 onDrawFrame 函数中:

public MyRenderer(Context ctx){

    this.context=ctx;
}

public void onDrawFrame(GL10 gl) {

    testFlag = renderFrame();


    if(testFlag > 0)
    {
        Intent myIntent = new Intent(this.context, MyActivity.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        this.context.startActivity(myIntent);
        testFlag = 0;
        return;
    }


}

这会在我的主要活动中调用 onPause() 来处理一些 OpenGL 人员。

切换活动时出现错误:

那时我收到以下错误:

在没有当前上下文的情况下调用 OpenGL ES API(每个线程记录一次)

谁能帮帮我吗?我意识到这是因为对 OpenGL 的调用不是从 OpenGL 线程进行的,但是我该如何解决呢?

从渲染器中切换活动的正确方法是什么?

4

2 回答 2

1

我使用了这些来源:
如何从非 Activity 类启动 Activity?
如何重新启动 Android Activity
这是在非 Activity 类(例如 Renderer)的类中切换 Activity 的解决方案

    private Context context; 
    public MyGLRenderer(Context context)  {
    super();
    this.context = context;                         
}

            Intent myIntent = new Intent(context, MyActivity.class);
            myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            ((Activity)context).finish();
            ((Activity)context).overridePendingTransition(0, 0);
            context.startActivity(myIntent);
            ((Activity)context).overridePendingTransition(0, 0);

于 2015-05-18T17:49:04.387 回答
0

从 GLSurfaceView.Renderer 文档:

线程
渲染器将在单独的线程上调用,从而使渲染性能与 UI 线程解耦。客户端通常需要从 UI 线程与渲染器通信,因为这是接收输入事件的地方。客户端可以使用任何标准 Java 技术进行跨线程通信,也可以使用 queueEvent(Runnable) 便捷方法。

您应该能够通过从您的onPause()方法发布的此类 Runnable 正确执行 OpenGL 调用。

我不认为您从 GL 线程启动活动切换这一事实是问题的一部分(它看起来确实有点奇怪,但我会假设您有充分的理由这样做:))。

于 2015-05-16T18:53:45.180 回答