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:

Введите описание изображения здесь

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

Введите описание изображения здесь

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

Введите описание изображения здесь

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

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

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

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

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

Спасибо заранее за вашу помощь.

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

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

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