마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[안드로이드] main thread와 서브 thread 통신 피드백 문제 도움 요청합니다.

0 추천
main에서 ui 이벤트(버튼, 터치 기타 등등)을 입력 받습니다.

대략...

----main activity---

public void onClick(View v){

switch(v.getId()))

{.,...

case a: mWorksCommControl.sendArrayCommand(cmdSendTemp);

break;

}

 

---WorkCommControl class----

public void sendArrayCommand(byte[] _buf){

여기서 서브 쓰레드를 이용해서 데이터를 보낸 후 일정시간(1 s) 동안 원하는 코드가 들어오지 않으면(수신) 다시 _buf를 send 한다.(총 3회... 4회부터는 다른 작업 실행)

}

private class sendArrayThread extends Thread...

{....

mBluetoothService.SendArrayCommand(buf);

}

----BluetoothService class------

public void SendArrayCommand(byte[] out){

ConnectedThread r;

synchronized(this){

if(mState!=STATE_CONNECTED)return;

r= mConnectedThread;

}

대략 적으로 이렇게 처리했습니다.

나와야 할 동작은

data send->feedback wait->feedback code receive=>feedback ok 이것은 한번에 원하는 코드를 받았을 경우이고..

data send->feedback wait->time over(1s)->data send->feedback wait-> feedback code receive->feedback ok

이런 방식으로 진행 됩니다. time over 가 총 4회가 넘어가면 다른 작업을 진행합니다.

하지만 synchronized 이것 때문인지...

feedback receive code가 main ui thread의 해당 이벤트 처리가 완료 되어야지만 feedback code receive 작업을 처리합니다.

결국 time over 4회 째 이벤트 코드가 종료 된후 receive 되었다는 log 메시지를 쭉 올라왔습니다.

 

원하는 동작대로 처리 할려면 thread말고 다른 방식으로 사용해야 하는지 아니면

synchronized를 사용할때 다르게 사용해야하는지 팁좀 부탁드립니다.
안드롭초보 (530 포인트) 님이 2015년 7월 22일 질문

1개의 답변

0 추천
 
채택된 답변

질문이 무슨 말인지 잘 모르겠네요, 아래 문장이 무슨 말인지 좀 더 알기쉽게

추가 설명 해주시면 답변하는데 도움 될 거 같습니다.

스레드 만들어서 블루투스 통신하는데 메인스레드가 왜 언급이 되는지 이해가 안되서요. 

 

>feedback receive code가 main ui thread의 해당 이벤트 처리가 완료 되어야지만 feedback code >receive 작업을 처리합니다.
>결국 time over 4회 째 이벤트 코드가 종료 된후 receive 되었다는 log 메시지를 쭉 올라왔습니다.

 
 
 
익명사용자 님이 2015년 7월 22일 답변
안드롭초보님이 2015년 8월 11일 채택됨
말을 잘못 적은감이 있네요...
ActivityMain에서 버튼 이벤트 발생 시 bluetooth로 데이터를 send 합니다.
이 send 알고리즘이 원래 계획대로라면 다른 디바이스로 데이터를 보내고
일정 시간 만큼 디바이스로 부터 데이터를 받았다는 신호를 받습니다.
이러면 완료가 되는 것이죠... 하지만 일정 시간 만큼 지났는데 확인 신호를 못 받으면 다시 데이터를 보냅니다. 이렇게 반복하는 것을 3번이 넘어가면 데이터 보내는 것을 실패로 간주하고 다른 작업을 실시하는 것입니다.....
그것이 1. data send->feedback wait->feedback code receive=>feedback ok

2. data send->feedback wait->time over(1s)->data send->feedback wait-> feedback code receive->feedback ok
여기에 해당하는 내용입니다.

그런데... 문제는 이벤트가 와서 블루투스 send 작업 시 데이터를 보내고 확인 데이터를 기다리는데 확인 데이터를 받는 곳이(블루투스 receive thread) synchronized가 되어 있어 이벤트 처리 함수 종료 후 확인 데이터를 일렬로 쭉 받습니다... 10개의 데이터를 보내면.. 3번씩 반복하니.. 총 30개의 확인 데이터가 이벤트 처리 함수 종료 후 날라오는 것이죠..... 감사합니다 ㅠㅠ;;
Class main {
    onClick() {
        new WorkCommControl().excute();
    }

    AsyncTask WorkCommControl {
        int cnt = 0;

        doInBackground() {
            Calendar dtTimeOutTime = Calendar.getInstance();  
            dtTimeOutTime.add(Calendar.SECOND, 1);

            //데이터 전송       
            mBluetoothService.SendArrayCommand(buf);

            do {
                if (Calendar.getInstance().after(dtTimeOutTime)) {
                    //1초 경과후 확인응답 없을시 재전송
                    mBluetoothService.SendArrayCommand(buf);
                    ++cnt;
                }
               
                //응답 읽기
                readline = mBluetoothService.응답Read();
                S.O.P(readline);

                if (readline.startsWith("확인응답") || cnt == 4) {
                    break;
                }

                //Thread.sleep(1);
            } while (true);   

            // 해당 작업 종료
        }
    }
}

대충 이런식으로 로직을 구현해 보세요 간단하게 쓴거라 문법은 맞지 않습니다.
...