// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v ==btnSend)
{
try
{
if (socket !=null && socket.isConnected())
{
byte[] w = edtSend.getText().toString().getBytes("UTF8");
out.write(w);
out.flush();
edtSend.setText("",TextView.BufferType.NORMAL);
}
} catch (Exception e)
{
handler.post(new Runnable()
{
public void run()
{
SocketEx.showDialog(current,"","통신 에러입니다.2");
}
});
}
}
}
//대화상자 표시
public static void showDialog(final Activity activity, String title, String text)
{
AlertDialog.Builder ad = new AlertDialog.Builder(activity);
ad.setTitle(title);
ad.setMessage(text);
ad.setPositiveButton("OK", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int whichButton){
activity.setResult(Activity.RESULT_OK);
}
});
ad.create();
ad.show();
}
}
(2) 스레드의 생성 - 프로그램 실행 단위. - 여러 개의 처리를 동시에 실행하는 것이 가능해 짐. - Thread 클래스를 상속한 클래스가 Runnable 인터페이스를 정의한 객체에 Thread 객체를 생성하고 start() 메소드를 호출 함. - Override한 run() 메소드 내의 처리가 호출한 곳과는 다른 스레드로 실행되게 함.
(3) 소켓 접속 - 최초에 통신할 컴퓨터와 접속 - Socket(String ip, int port) : ip주소와 port 번호를 반환 - 입력스트림: getInputStream / 출력스트림: getOutputStream
(4) 수신 루프 - 소켓이 접속되어 있다면, 수신을 무한 반복하게 함. - boolean isConnected: 소켓 접속이 되어 있는지 여부 확인.
(5) 데이터 수신 - 소켓 입력 스트림의 read() 메소드로 바이트 배열을 읽어 데이터를 수신합니다. read() 메소드를 호출하면, 소켓이 데이터를 수신할 때까지 무한 대기하다가 데이터를 수신하면 수신한 데이터를 바이트 배열로 변환합니다. 이 프로그램에서는 크기가 0 이상일 때에는 문자열로 변환해서 화면에 표시합니다.
(6) 핸들러에 의한 사용자 인터페이스 조작 - Android의 사용자 인터페이스 (EditText등) 조작은 반드시 스레드 핸들러로부터 실행할 필요가 있습니다. 해당 핸드럴 이외의 스레드로부터 조작하면 곤란해 집니다. 스레드를 스스로 생성하고 있으므로, 직접 조작이 불가능 함. 그래서 자신이 사용할 주 스레드내의 핸들러도 스스로 생성하고, 핸들러를 통해 사용자 인터페이스를 조작하도록 함. Handler 객체를 생성한 후, Handler 클래스의 post() 메소드에 Runnable 인터페이스의 정의를 전달 합니다.