문제

그냥 와서 내 애플리케이션을 다듬고 사용자가 떠난 후에 다시 시작하세요.응용 프로그램이 복원되면 IllegalThreadStateException이 발생하는데 이는 상당히 짜증나는 일입니다.이 문제는 Google이 제공하는 예에 있습니다. 달착륙선.SurfaceView를 사용할 때 작업을 복원하는 방법을 찾은 사람이 있습니까?

도움이 되었습니까?

해결책

나는 이것이 Surface와 Activity가 처리되는 방식의 차이 때문에 발생한다고 믿습니다.LunarLander 애플리케이션을 종료하면 표면이 파괴되지만(surfaceDestroyed 호출) 활동은 일시 중지만 됩니다(onPause 호출).활동이 재개되면 표면이 생성되고(surfaceCreated 호출) 그리기 스레드를 다시 시작하려고 시도합니다.

즉, 스레드 생성은 활동의 수명 주기와 함께 발생하고 스레드 삭제는 SurfaceView의 수명 주기와 함께 발생하며 항상 일치하지는 않으므로 IllegalThreadStateException이 발생합니다.해결책은 스레드를 둘 다가 아닌 하나의 수명주기 또는 다른 수명주기에 연결하는 것입니다.

제 생각에는 이 스레드 가능한 해결책을 제안하지만 그것이 작동하는지 모르겠습니다.

다른 팁

내 자신의 테스트에서 Surfacecreated () 메소드에서 드로잉 스레드를 만듭니다. 이는 문제를 완전히 해결합니다. 이것이 내 방법 구현입니다.

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}

그래서 코드에서 언제 surfaceDestroyed() 호출됩니다 mRun 거짓과 전화로 thread.join(). 이로 인해 실이 완성되고 죽게됩니다. 앱이 다시 시작되면 surfaceCreated() 호출됩니다 thread.start(). 스레드가 죽은 후에 시작할 수 없기 때문에 유효하지 않습니다.

수정할 두 가지 옵션 :

a) 새 스레드를 시작하십시오 surfaceCreated() - 위와 같이.

b) 또는 체크인을 추가하십시오 surfaceDestroyed() 에 맞서 Activity.isFinishing() true 인 경우에만 실을 끝내십시오. 이렇게하기 위해 나는 while(mRun) 다른 while 루프가있는 스레드에서 만 거짓으로 만 설정됩니다. isFinishing() 진실을 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top