Подтвердить что ты не робот

OpenGLES на Android - IllegalStateException: setRenderer уже вызван для этого экземпляра

Я новичок в OpenGL-ES на Android, поэтому извините меня за мой вопрос noobish. Я создаю эту программу для Android v2.2 - SDK # 8. Мой планшет поддерживает до Android v3.1

Я пытаюсь настроить среду OpenGL-ES для Android, следуя инструкциям на developer.android.com. Программа скомпилирована в порядке, и она должна была отображать простой синий экран на устройстве. Однако, когда я попытался запустить его на своем устройстве Android, я получил сообщение об ошибке "Ошибка IllegalStateException: setRenderer уже вызвана для этого экземпляра".

Ниже мой код:

public class TA_SpaceActivity extends Activity 
{
    private MyGLSurfaceView myGLView;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        myGLView = new MyGLSurfaceView(this); //NOTE: this is where the app crashed
        setContentView(myGLView);
    }
}

class MyGLSurfaceView extends GLSurfaceView
{
    public MyGLSurfaceView(Context context) 
    {
        super(context);
        setRenderer (new MyRenderer());
        setEGLContextClientVersion(2);
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }
}

class MyRenderer implements GLSurfaceView.Renderer
{
    public void onSurfaceCreated(GL10 unsued, EGLConfig config)
    {
        GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused)
    {
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height)
    {
        GLES20.glViewport(0, 0, width, height);
    }
}  

Во-первых, я убедился, что тег uses-feature для OpenGLES был включен в файл AndroidManifest.xml:

enter image description here

Затем, когда я выполнил прогон Debug, ActivityThread.perfo показал сообщение об ошибке "Источник не найден". Итак, я добавил путь к нему (и я также убедился, что файл android.jar существует в каталоге)

enter image description here

Тем не менее, приложение разбилось прямо на строке "myGLView = новый MyGLSurfaceView (this)". Когда я осмотрел LogCat, он показал, что программа вызвала исключение IllegalStateException при вызове функции setRenderer().

enter image description here

Итак, у меня есть две загадки, которые я не понимаю на данный момент:

1) Почему он выбросил сообщение об ошибке "Источник не найден", когда ссылка на источник была четко определена в проекте?

2) Почему он сказал, что для этого экземпляра был вызван "setRenderer()"? Я называл это только один раз в моем подклассе MyGLSurfaceView.

Для первой головоломки, из того, что я слышал, Eclipse почти всегда будет вызывать сообщение "Source Not Found", когда для каждой случайной ошибки вы делаете. Это правильно? (если нет, пожалуйста, исправьте меня).

Если это так, то я думаю, что основная причина проблемы связана с методом setRenderer() в моем подклассе. После целого дня возиться, я не мог найти способ исправить эту проблему. Может ли какой-нибудь орган дать мне некоторый указатель на то, что я могу попытаться исправить это "IllegalStateException: setRenderer() был вызван для этого экземпляра" проблема?

Заранее благодарим вас за помощь.

4b9b3361

Ответ 1

Я понял это. После перекопа в документацию Google я обнаружил, что setEGLContextClientVersion() вызвал checkRenderThreadState(); эта функция выдает незаконное исключение ", вызванный для этого экземпляра" setRenderer() ", если был вызван setRenderer(). Итак, вместо того, чтобы сначала вызвать setRenderer(), я сначала вызвал setEGLContextClientVersion(), и программа скомпилировалась и запускалась без проблем. Теперь я вижу красивый синий экран, отображаемый на моем устройстве.

Здесь изменение, которое я сделал:

public MyGLSurfaceView(Context context) 
{
    super(context);
    setEGLContextClientVersion(2);
    setRenderer (new MyRenderer());
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}