안드로이드 개발 질문/답변
(글 수 45,052)
언젠가는 제가 답변을 할 수 있는 날이 오리라 믿으며 염치없이 또 질문 드립니다.
아래 인텐트를 이용해 다른 액티비티를 실행시 생기는 오류에 대해서 질문을 드렸었습니다.
회색님 말씀대로 두 번째 액티비티 종료시 첫번째 액티비티에서 다시 쓰레드의 start()가 호출되어 생기는 문제더군요.
그래서 좀 일반적인 질문을 드리고 싶습니다. 지금 만들고 있는 프로그램은 거의 LunarLander와 JetBoy를 참고 하고 있습니다.
프로젝트는 액티비티 A와 B로 구성되어 있습니다. 각 액티비티들은 SurfaceView를 상속받은 AView와 BView를 포함하고 있습니다.
AView와 BView는 LunarLander 예제처럼 이미지 드로잉용 쓰레드를 사용합니다.
쉽게 예를 들자면 게임의 메뉴화면과 본화면이라고 생각하면 되겠습니다.
쓰레드의 시작 역시 LunarLander 예제처럼 처리하였습니다.
AView와 BView 모두 위와 같은 코드를 가지고 있습니다.
A에서 Intent를 통해 B를 실행시키고 B에서 게임 도중 뒤로가기 버튼을 누르니 A로 돌아는 오는데 이미 mThread.mRun = false로 run()이 종료된 상태이니 화면을 그리지는 않겠지요.
그래서 질문은 이렇게 UI 표시용 쓰레드를 가진 다수의 액티비티를 이용해 어플리케이션을 제작할 경우 뒤로가기 버튼을 눌러 앞의 액티비티로 돌아 갔을 때 문제 없이 해당 액티비티가 진행될 수 있도록 하는 방법입니다.
어떤 프로그래밍 패턴이 있을 것 같은데 LunarLander나 JetBoy 예제만으로는 감을 잡기가 힘드네요. 사실 Java 언어도 이번 프로젝트에서 처음 해보는 거라서 불쑥 Thread를 잡고 흔들자니 어설픔이 장난이 아닙니다.
부디 길 잃은 프로그래머 하나 구해주시길 간절히 부탁 드리겠습니다.
아래 인텐트를 이용해 다른 액티비티를 실행시 생기는 오류에 대해서 질문을 드렸었습니다.
회색님 말씀대로 두 번째 액티비티 종료시 첫번째 액티비티에서 다시 쓰레드의 start()가 호출되어 생기는 문제더군요.
그래서 좀 일반적인 질문을 드리고 싶습니다. 지금 만들고 있는 프로그램은 거의 LunarLander와 JetBoy를 참고 하고 있습니다.
프로젝트는 액티비티 A와 B로 구성되어 있습니다. 각 액티비티들은 SurfaceView를 상속받은 AView와 BView를 포함하고 있습니다.
AView와 BView는 LunarLander 예제처럼 이미지 드로잉용 쓰레드를 사용합니다.
쉽게 예를 들자면 게임의 메뉴화면과 본화면이라고 생각하면 되겠습니다.
쓰레드의 시작 역시 LunarLander 예제처럼 처리하였습니다.
public void surfaceCreated(SurfaceHolder arg0) { mThread.mRun = true; try { mThread.start(); } catch (Exception e) { } } public void surfaceDestroyed(SurfaceHolder arg0) { mThread.mRun = false; boolean retry = true; while (retry) { try { mThread.join(); retry = false; } catch (InterruptedException e) { } } }
AView와 BView 모두 위와 같은 코드를 가지고 있습니다.
A에서 Intent를 통해 B를 실행시키고 B에서 게임 도중 뒤로가기 버튼을 누르니 A로 돌아는 오는데 이미 mThread.mRun = false로 run()이 종료된 상태이니 화면을 그리지는 않겠지요.
그래서 질문은 이렇게 UI 표시용 쓰레드를 가진 다수의 액티비티를 이용해 어플리케이션을 제작할 경우 뒤로가기 버튼을 눌러 앞의 액티비티로 돌아 갔을 때 문제 없이 해당 액티비티가 진행될 수 있도록 하는 방법입니다.
어떤 프로그래밍 패턴이 있을 것 같은데 LunarLander나 JetBoy 예제만으로는 감을 잡기가 힘드네요. 사실 Java 언어도 이번 프로젝트에서 처음 해보는 거라서 불쑥 Thread를 잡고 흔들자니 어설픔이 장난이 아닙니다.
부디 길 잃은 프로그래머 하나 구해주시길 간절히 부탁 드리겠습니다.
2009.06.02 15:04:07
흠... 메뉴화면도 서페스뷰에서 돌리신다면 왜 액티비티를 두개로 나누시는지 모르겠군요.
저 같은 경우는 그냥 서페스퓨 하나 띠워서 그 안해서 다 햇거든요. -_-)
꼭 할 이유가 있으신 거라면 복귀할때 스레드 재생성 해서 돌리면 될거 같은데요?
2009.06.02 18:22:15
답변 감사 드립니다.
굳이 특별한 이유라고 한다면 본게임을 제외한 나머지 액티비티들을 나중에 재사용하고 싶기 때문이구요. 여러개의 액티비티를 이용한 프로그램을 제작해 보고 싶어서이기도 합니다.
알까기명인님께서 말씀하신 쓰레드 재생성을 하기 위해서는 액티비티 B로 넘어가기 전에 기존 쓰레드를 제거해야 할 것 같은데 그럼 위의 코드에서 SurfaceDestroyed()에 mThread.destroy()를 호출하면 되는 건가요? 이클립스의 풍선 도움말을 보니 쓰레드의 destroyed()는 데드락을 유발할 수 있어서 deprecated 된다고 하는데 상관 없는건가요?
굳이 특별한 이유라고 한다면 본게임을 제외한 나머지 액티비티들을 나중에 재사용하고 싶기 때문이구요. 여러개의 액티비티를 이용한 프로그램을 제작해 보고 싶어서이기도 합니다.
알까기명인님께서 말씀하신 쓰레드 재생성을 하기 위해서는 액티비티 B로 넘어가기 전에 기존 쓰레드를 제거해야 할 것 같은데 그럼 위의 코드에서 SurfaceDestroyed()에 mThread.destroy()를 호출하면 되는 건가요? 이클립스의 풍선 도움말을 보니 쓰레드의 destroyed()는 데드락을 유발할 수 있어서 deprecated 된다고 하는데 상관 없는건가요?