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

소켓 통신 도와주세요 데이터 송수신 문제

0 추천

소켓 통신을 구현중인데 데이터 갱신과 화면에 뿌려주는데 문제가 있습니다.

 

서버에서 데이터를 3초에 한번씩 보내줍니다. (바이트 데이터)

클라이언트 수신스레드에서 데이터를 수신받고

기존 Array리스트 내용을 지우고 새로운 내용를 넣습니다.

액티비티 화면에서 Array리스트를 불러옵니다.

 

여기서 문제는 제가 화면을 들어가면

1. 새로만든 데이터 리스트가 옵니다. (정상)

2. 새로 만들기 이전의 데이터가 옵니다. (비정상)

3. 데이터를 새로 만드는 도중 불러오면서 에러가 납니다. (비정상)

그래서 화면에 이전값이 떳다가 최신갑으로 변경되거나

아무것도 뜨지 않다가 최신값으로 변경되기도 합니다.

이문제를 해결하고 싶은데 어떤 방식으로 변경해야 될까요?

 

스터디가 부족해서 소켓통신 데이터 수신 처리방법에 대해서도 알려주시면 감사하겠습니다.(--)(__)

주요 부분 소스코드

// 수신부

readBuffer = new byte[4096];

while ((count = dis.read(readBuffer, 0, readBuffer.length)) != -1) {

     list = new ArrayList<Data>;

    list.removeAll(list);

    int count = 0;

    for(int i = 0; i<10; i++)  {

        int tmpId= readBuffer[count] & 0xFF;
        String strId= Integer.toString(tmpId);
        int tmpNum= readBuffer[count+1] & 0xFF;
        String strNum= Integer.toString(tmpNum);
        int tmpType= readBuffer[count+2] & 0xFF;
        String strType= Integer.toString(tmpType);
        Data data = new Data(strId, strNum, strType)
        list.add(data);
        count += 3;
   }
}
 
public ArrayList<Data> getData() {
    return list;
}

 

// 액티비티 화면

Read.getInstance.getData() 

이런식으로 액티비티에서 불러와 데이터를 사용 했습니다.

비동기는 ArrayList가 동기화를 보장해주지 않는다고 하더라구요

 

데이터 처리를 해본적이 없어서 바이트 데이터를 정상적으로 수신은 하지만 이 데이터를

어디에 저장해서 ArrayList로 만들어서 액티비티 화면에 보내줘야 할지 모르겠습니다.

스레드와 동기화 지식이 부족한저에게 팁을 알려주시면 감사겠습니다.

 

bellfe0402 (1,770 포인트) 님이 2015년 3월 27일 질문
bellfe0402님이 2015년 4월 7일 수정
주요 부분의 코드도 같이 올려주는게 나을 것 같네요
소스코드를 간단하게 올렸습니다.

1개의 답변

0 추천
 
채택된 답변
"기존 Array리스트 내용을 지우고 새로운 내용를 넣습니다."

이부분이 잘못되었습니다.

Activity에서 데이터를 사용하는 것과 데이터를 송수신하는 것이 비동기적으로 수행되므로 이렇게 하면 안됩니다.
익명사용자 님이 2015년 3월 27일 답변
bellfe0402님이 2015년 4월 15일 채택됨
그럼 어떤식으로 변경해야 할까요? 팁을 좀 주신다면?
...