안드로이드 개발 질문/답변
(글 수 45,052)
액티비티안에
쓰레드 상속받은 클래스를 하나 만들어서
해당액티비티의 onCreate에 쓰레드.start();를 했습니다.
쓰레드 내에 rum()에는 while(){}문을 돌게 해놓았습니다.
데브폰과 이클립스를 유에스비로 연결한 상태에서 쓰레드안에 while문이 한바퀴 돌때마다
Log를 출력시켰습니다.
데브폰의 취소버튼을 눌러서 해당 프로그램을 나오고 데브폰 바탕화면 홈으로 왔는데,
이클립스의 Log cat에는 로그값이 계속 출력됩니다.
그래서 폰안에서 프로그램이 종료 되었는데 해당 스레드는 종료가 안된것이 아닌가 하는 생각이 ?? 듭니다.
해당 스레드를 종료시키기 위해서
액티비티의 onPause와 onStop에
쓰레드.stop(); //이건 deprecated되었다고 나오고.
쓰레드.interrupt();
그리고 쓰레드.종료함수();//제가 종료함수를 만들어서 while(flag) 의 flag값을 false로 되게 하였습니다.
이렇게 세가지 방법을 모두 해보았지만, 이클립스 Log Cat에는 스레드가 돌고있다는 값이 계속 찍혀 나옵니다.
결국 wait()을 써서 로그가 찍히는걸 막기는 했지만, 이상한 에러 토스트가 살포시 떠주는군요..
쓰레드와 그안의 while문을 깔끔히 끝내는 방법이 없나요?
P.S 안드로이드는 스레드 쓰는게 좀 특이하다는거 같던데, 화면구성용 스레드하나랑 꾸준히 입력값변화를 측정하는 쓰레드 이렇게 메인엑티비티 외에 두개의 쓰레드를 추가로 쓰려고 하는데, 문제 없는 건가요?
쓰레드 상속받은 클래스를 하나 만들어서
해당액티비티의 onCreate에 쓰레드.start();를 했습니다.
쓰레드 내에 rum()에는 while(){}문을 돌게 해놓았습니다.
데브폰과 이클립스를 유에스비로 연결한 상태에서 쓰레드안에 while문이 한바퀴 돌때마다
Log를 출력시켰습니다.
데브폰의 취소버튼을 눌러서 해당 프로그램을 나오고 데브폰 바탕화면 홈으로 왔는데,
이클립스의 Log cat에는 로그값이 계속 출력됩니다.
그래서 폰안에서 프로그램이 종료 되었는데 해당 스레드는 종료가 안된것이 아닌가 하는 생각이 ?? 듭니다.
해당 스레드를 종료시키기 위해서
액티비티의 onPause와 onStop에
쓰레드.stop(); //이건 deprecated되었다고 나오고.
쓰레드.interrupt();
그리고 쓰레드.종료함수();//제가 종료함수를 만들어서 while(flag) 의 flag값을 false로 되게 하였습니다.
이렇게 세가지 방법을 모두 해보았지만, 이클립스 Log Cat에는 스레드가 돌고있다는 값이 계속 찍혀 나옵니다.
결국 wait()을 써서 로그가 찍히는걸 막기는 했지만, 이상한 에러 토스트가 살포시 떠주는군요..
쓰레드와 그안의 while문을 깔끔히 끝내는 방법이 없나요?
P.S 안드로이드는 스레드 쓰는게 좀 특이하다는거 같던데, 화면구성용 스레드하나랑 꾸준히 입력값변화를 측정하는 쓰레드 이렇게 메인엑티비티 외에 두개의 쓰레드를 추가로 쓰려고 하는데, 문제 없는 건가요?
2009.08.13 17:11:26
답변감사합니다! 안드로이드 소스라 하심은. sdk platform폴더 내의 샘플인가요, 아니면 구글 사이트의 프로젝트 검색에 올라있는 소스인가요?
첫번째 방법은 시도해봤는데 안되었고, 알아서 종료를 안해준다는 생각을 log를 보고 하게되었네요
두번재 방법 시도해보겠습니다 감사합니다.
첫번째 방법은 시도해봤는데 안되었고, 알아서 종료를 안해준다는 생각을 log를 보고 하게되었네요
두번재 방법 시도해보겠습니다 감사합니다.
2009.08.13 22:40:09
안드로이드는 백버튼을 누르는걸로는 어플을 종료하지 않기 때문에 다른 방법을 이용해서 어플을 종료해줘야 합니다.
어들 실행하다가 메모리가 부족하면 자동으로 가장 오래된 어플을 종료하게끔 되어있어요.
그런데 쓰레드 stop이 안된다니 이상하군요..
어들 실행하다가 메모리가 부족하면 자동으로 가장 오래된 어플을 종료하게끔 되어있어요.
그런데 쓰레드 stop이 안된다니 이상하군요..
2011.03.16 21:06:00
저도 stop()도 안 되고 destory()도 안 되고 찾다가 괜찮은 블로그 예제를 발견했네요.
http://roter.pe.kr/134 해봤는데 되네요..^^ 오래된 글인데.. 누군가에게 도움이 되길 바라며 댓글 남깁니다.
{
if( m_Thread != null && m_Thread.isAlive())
m_Thread.interrupt();
}
http://roter.pe.kr/134 해봤는데 되네요..^^ 오래된 글인데.. 누군가에게 도움이 되길 바라며 댓글 남깁니다.
{
if( m_Thread != null && m_Thread.isAlive())
m_Thread.interrupt();
}
안드로이드 소스에 검색해보시면 예제가 많습니다.
대충 보면...
1) run()에서 플래그를 세워서 ex) while(!done) 루틴을 실행합니다.
(아마도 쓰레드는 필요없다고 판단되면 안드로이드가 알아서 제거해줄것입니다...(추측))
2) Thread.join()을 써서 메인 쓰레드가 종료될때 같이 종료되게 구성되있습니다.
두가지 정도인거 같네요... 다른 방법을 쓰고 싶으시다면.. 소스를 더 살펴봐야겠네요..(있을까요?)
eclipse@noth:~/sdk/android/src/packages/apps$ pwd
/home/eclipse/sdk/android/src/packages/apps
eclipse@noth:~/sdk/android/src/packages/apps$ find . -type f -name "*.java" -exec grep -H "Thread" {} \;
./IM/src/com/android/im/app/FrontDoorPlugin.java: new Thread(new Runnable() {
./IM/src/com/android/im/app/AddContactActivity.java: public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
./IM/src/com/android/im/app/ContactListFilterView.java: public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
./IM/src/com/android/im/imps/SmsDataChannel.java: new Thread(mTimer, "SmsDataChannel timer").start();
./IM/src/com/android/im/imps/TcpCirChannel.java: private Thread mCirThread;
........