2014-02-18 2 views
0

내 앱에는 GLSurfaceView가 포함 된 두 번째 활동이 있습니다. 첫 번째 활동에서 수집 된 데이터의 OpenGL ES 1.0 차트를 보여줍니다. 오리엔테이션 변경을 포함하여 모든 것이 잘 작동합니다. 앱은 두 가지 활동으로 튀어 나올 수 있으며 방향 변경을 처리하고 아무 일도 일어나지 않습니다.Android/OpenGL 해결 IllegalStateException

그러나 두 번째 활동에서 OpenGL 차트를 표시하고 Android HOME 화면을 누른 다음 MENU의 앱 목록에서 선택하여 앱으로 돌아 가면 "불행히도, XXX이 (가) 중지되었습니다. "

Logcat에서 나는 이걸 보았습니다 : IllegalStateException: setRenderer has already been called for this instance 그리고 나는 Activity의 onStart() 방법에있는 코드의 mGLView.setRenderer (new GLRenderer (this)); 라인까지 추적했습니다.

나는 사고가 발생했을 때, 활동하지 않는 한, 나는

02-18 09:48:08.743 1953-1953/com.hippo.happ I/HActivity? Just before the setRenderer call... 
02-18 09:48:08.753 1953-1953/com.hippo.happ D/AndroidRuntime? Shutting down VM 
02-18 09:48:08.753 1953-1953/com.hippo.happ W/dalvikvm? threadid=1: thread exiting with uncaught exception (group=0xb0d75b08) 
02-18 09:48:08.763 1953-1953/com.hippo.happ E/AndroidRuntime? FATAL EXCEPTION: main 
    Process: com.hippo.happ, PID: 1953 
    java.lang.RuntimeException: Unable to resume activity {com.hippo.happ/com.hippo.happ.HChartActivity}: java.lang.IllegalStateException: setRenderer has already been called for this instance. 

... 로그 캣에서 다음을 참조하지만이 표시되지 않습니다 ... 바로 앞이 호출 후 로그 라인을 넣어 처음으로 생성되는 : 나는 하지 전혀 setEGLContextClientVersion를 호출 오전,도 내가 setRenderMode로 렌더링 모드를 변경하고 있음을 확인 할 수

02-18 09:47:51.123 1953-1953/com.hippo.happ I/HActivity? Just after the setRenderer call... 

. I onPause()onResume()으로 구현되었습니다.

일부 코드를 사용하여 "setRenderer가이 인스턴스에 대해 이미 호출되었습니다"(문서에서 적절한 get 또는 check 메소드를 볼 수 없음) 또는 try..catch에서 단지 setRender 행을 감싸고 있는지 확인할 수 있습니까? 블록 및 smother IllegalStateException? 그게 이 방법을 권장합니까?

+0

** 'IllegalStateException' ** ** 버려 질 수 있습니다. OpenGL 차트가 완료되면 예상대로 반환됩니다.이 작업을 수행하는 올바른 방법 인 것처럼 느끼지는 않지만, 적어도 앱은' t 충돌. 다른 조언을 환영 할 것입니다 ... – Hippogriff

답변

0

onStart()는 액티비티의 가시적 인 수명 시작 부분에 호출됩니다. 따라서 홈 화면으로 돌아가서 실행하면 처음으로 실행되는 라이프 이벤트입니다. 해당 메서드에서 렌더러를 설정 했으므로 Activity가 생성 될 때 이전에 설정 되었기 때문에 렌더링에 실패합니다. 렌더러는 onCreate()의 일부로 설정하는 것이 이상적입니다. 작업이 다시 시작될 때 렌더링이 다시 실행되지 않기 때문입니다.

당신은 onCreate()에서 인스턴스화하는 GLSurfaceView라는 하위 클래스가 있다고 가정합니다. 해당 클래스의 생성자에서 렌더러를 설정할 수 있습니다. 또는 코드에서 이미 수행하지만 onStart()에서 GlSurfaceView를 인스턴스화하는 경우 onCreate()로 옮기는 것이 좋을 것입니다.

+0

고맙습니다. 내'GLSurfaceView'는 Fragment의 XML에 정의되어 있습니다. 나는'mGLView.setRenderer (새로운 GLRenderer (this)); 코드를'onStart()'로 옮겼다 고 생각한다.'mGLView = (GLSurfaceView) this.findViewById (R.id.glSurface);' onCreate()'. 나는 이것에 대해 다시 한번 살펴 보겠다. – Hippogriff

+0

나는 파편을 사용하고 있다는 것을 몰랐다. 그 경우에는 onCreateView 내에서 설정하는 것이 좋습니다 (조각 onCreate 이후에 실행 됨). 그 방법으로 프래그먼트의 레이아웃에 접근 할 수있을 것이고 (나는 그것을 팽창 시킨다고 가정한다) 한번만 동작 할 것이다. – NigelK

관련 문제