현재 안드로이드 어플과 wifi모듈과 소켓통신으로 연결해서 통신테스트를 하는중입니다.
메뉴상에서 wifi모듈과 연결및 연결해지를 메뉴버튼을 통해서 하고있습니다.
문제는 어플쪽에서 WIFI모듈과 소켓연결하는 부분을 먼저 수행한 다음에 WIFI소켓 해제하는 부분을 수행한후
다시 WIFI모듈과 소켓 연결하는 부분을 수행하면 뻗어버리
처음 연결과 연결해제는 잘 되는데 해제후 다시 연결하면 프로그램이 뻗어버리네요... 문제는 스레드를 두번 스타트하는것이
문제인거같은데 인터넷에서 검토했던 인터럽트를 걸어 while문에서 빠져나오거나 하는 방법등을 사용해 봤는데 여전합니다.
문제가 뭔지 알수가없습니다. 도와주세요~~~~
고수님들 원인좀 봐주세요...
-----WIFI모듈과 소켓 연결하는 부분입니다.------------------------
case MENU_ITEM_WIFI_CONNECT:
// Launch the DeviceListActivity to see devices and do scan
try {
startTimer();
setSocket(ip, port);
output = new BufferedOutputStream(socket.getOutputStream());
//input = new BufferedInputStream(socket.getInputStream());
//checkUpdate.setDaemon(true);
checkUpdate.start();// 쓰레드 시작부분인데 이 부분을 한번 연결한후 다시 연결하면 다운되어 버립니다.
Toast.makeText(getBaseContext(), "WIFI 모듈과 연결되었습니다.", 0).show();
wifiPaired = true;
//WIFI의 경우 Connetc메세지를 전송해줌
} catch (IOException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
//Log.e("TCP", "C: Error2", e);
Toast.makeText(getBaseContext(), "WIFI 모듈과 연결 에러발생.", 0).show();
}
return true;
----- 소켓 연결 해제하는 부분입니다..
case MENU_ITEM_WIFI_DISCONNECT:
// Stop the Bluetooth chat services
wifiPaired = false;
Toast.makeText(getBaseContext(), "WIFI 모듈과 연결이 해제되었습니다", 0).show();
stopTimer();
try{
//소켓 해제하기전 UART로 DISCONNECT 메세지를 보냄
output.close();
//input.close();
//networkWriter.close();
networkReader.close();
socket.close();
//checkUpdate.interrupt();
//checkUpdate.stop();
}catch(IOException e){
}
return true;
//-------------------------------- 쓰레드 관련부분입니다.
private Thread checkUpdate = new Thread() {
public void run() {
try {
String line;
Log.w("ChattingStart", "Start Thread");
while (true) {
Log.w("socket data receive", "socket data receive");
line = networkReader.readLine();
html = line;
mHandler.post(showUpdate);
}
} catch (Exception e) {
}
}
};
private Runnable showUpdate = new Runnable() {
public void run() {
byte[]b = html.getBytes();
for (int i=0 ; i < 15 ; i++)
{
receivedPacket[i] = b[i];
}
};
public void setSocket(String ip, int port) throws IOException {
try {
socket = new Socket(ip, port);
// networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
System.out.println(e);
e.printStackTrace();
}
}
아래는 로그에서 뻗는부분을 캡쳐한 부분입니다.
결국엔 타이밍 문제인거 같은데 . . IsSingleton같은 전역플래그를 하나 설정해서 쓰레드안에서 while(true&IsSingleton) 같이 루푸를 돌리심이 어떨지~ 쓰레드 시작과 종료에 반드시 IsSingleton 초기화가 필요합니다... 물론, 쓰레드에도 IsRunning 이나 쓰레드ID를 체크하는 유효성 관련 함수가 있는걸로 알고있지만 이방법이 심플한듯 ㅋ