총 게시물 38,899건, 최근 1 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[안드로이드]

안드로이드 소켓통신 문제 android android.os.NetworkOnMainThreadException

글쓴이 : 자네 날짜 : 2017-10-11 (수) 16:04 조회 : 1497
글주소 : http://www.androidside.com/B49/168506
 
  오라클자바교육센터 구로본점
안드로이드전문교육, SDK실무개발, APP개발프로젝트, 실습폰지원, 재직자환급
www.oraclejava.co.kr
  임베디드 시스템 마이크로비젼
임베디드 개발보드, 개발용역, IAR 컴파일러 총판, 에뮬레이터.
www.mvtool.co.kr
  서울정보산업교육원
정보보안 파이선 PHP 웹모의해캥 악성코드 리버스엔지니어링 모바일취약점분석
www.siie.co.kr
신청하기


안드로이드, 자바 그리고 다양한 질문에 대해 성실히 답해드립니다. Q&A Jang

android android.os.NetworkOnMainThreadException

버튼을 클릭하고나서 데이터를 전송할려고하는데.. 메인쓰레드에서 하지마라고 계속뜨네요.. 어떻게하면 
버튼클릭하면 데이터 전송이 가능한가요?

소켓 스레드
public class SoketThread extends Thread{

@Override
public void run() {
if(socket==null) {
try {
InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(ip), port);
socket = new Socket(ip, port);

buffRecv = new DataInputStream(new DataInputStream(socket.getInputStream()));
buffSend = new DataOutputStream(new DataOutputStream(socket.getOutputStream()));
socket.connect(socketAddress, 1000);
thread_check= true;
} catch (Exception e) {
Log.e("접속 오류=", e.toString());
}

}
Log.e("접속완료", "접속되었음 클라이언트트");


while(thread_check) {
String aLine = null;

while (!Thread.interrupted()) {
try {
aLine = buffRecv.readLine();
if (aLine != null) Log.e("읽기=", aLine);
else break;
} catch (IOException e) {
Log.e("읽기 오류=", e.toString());
e.printStackTrace();
}
}
}

} // end run()

public void bt_click(byte[] move) {

try {
if (buffSend != null) {
Log.e("전송11=", move + "");
buffSend.write(move);
} else {
Log.e("전송2=", "null");
}
} catch (Exception e) {
Log.e("전송오류 =", e.toString());
}

}


} // end class BackThread


bt_click() 이걸 호출합니다.
버튼 터치했을경우 
up2.setOnTouchListener(new View.OnTouchListener(){
    @Override
public boolean onTouch(View v, MotionEvent event) {

int action = event.getAction();

if(MotionEvent.ACTION_DOWN==action){
Log.e("마우스=","up 눌림");

soketThread.bt_click(up_c);

}else if(MotionEvent.ACTION_UP==action){
Log.e("마우스=","up 뗌");
soketThread.bt_click(up_u);
}

return true;
}
});



질문자가 자신의 포인트 25 점을 걸었습니다.
답변하시면 포인트 2을, 답변이 채택되면 포인트 20을 드립니다.

질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

OSKiller 2017-10-11 (수) 16:32
NetworkOnMainThreadException
ui스레드에서 네트웍 작업 하지 말라는겁니다
새로운 스레드를 생성 해서 네트웍 관련된 부분을 실행 하세요
댓글주소 추천 0 반대 0
     
     
자네 2017-10-11 (수) 20:03
스레드를 생성했는데.. 혹시 메인 클레스 안에서 스레드 만들어서 그런가요?
댓글주소 추천 0 반대 0
          
          
자네 2017-10-11 (수) 20:07
버튼을 클릭하면  정보를 보내야되서.. ui에서 접근을 하긴 해야되는데..
댓글주소 추천 0 반대 0
               
               
OSKiller 2017-10-12 (목) 11:57
[@자네]
working 스레드에서 연결/전송/수신을 해야 하며
ui스레드에서 직접 하면 안됩니다
https://academy.realm.io/kr/posts/android-thread-looper-handler/
이런걸 참조 해서 해보세요
댓글주소 추천 0 반대 0
뉴키 2017-10-12 (목) 11:25
http://newkie.tistory.com/15

스레드 작업이 끝나면 UI 업데이트

하는 소스입니다.
댓글주소 추천 0 반대 0
그다지 2017-10-12 (목) 14:54
음... 잘보니 보이진 않지만 예상에 soketThread를 onCreate에 생성하고
start를 onCreate에서 하는듯 싶은데... 
스레드에 대한 처리 자체를 버튼 이벤트로 넣어서 처리해야 될겁니다.
에러 처리에 대한 몇번째 라인의 문제인지 확실치 않아서 모르겠지만...
댓글주소 추천 0 반대 0
자네 2017-10-12 (목) 22:26
모두 답변 감사합니다 대충 감이 잡히네요 이제 ㅠㅠ
댓글주소 추천 0 반대 0
이전글  다음글  목록 글쓰기

 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기