안드로이드 개발 질문/답변
(글 수 45,052)
현재 어플리케이션 개발중에 여러개의 액티비티를 사용해야 하는 상황이 왔는데요..
소켓 통신을 하던 중이라 서비스를 이용해야 할 것 같아서 여러가지 정보를 찾고있는데
검색력이 아직 부족해서인지 쉽게 찾아지질 않네요;;
일단 저의 생각대로 코드를 짜봤는데 그러면 잘 안되더라구요..
public class SocketService extends Service {
public static Socket socket;
public static InputStream is;
public static OutputStream os;
public static PrintWriter pos;
public static BufferedReader read;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
try {
if(socket == null){
socket = new Socket("192.168.0.32",10008);
is = socket.getInputStream();
os = socket.getOutputStream();
pos = new PrintWriter( SocketService.socket.getOutputStream());
read = new BufferedReader(new
InputStreamReader(SocketService.socket.getInputStream()));
Toast.makeText(this,"Socket created ...", Toast.LENGTH_LONG).show();
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onDestroy() {
try {
socket.close();
is.close();
os.close();
pos.close();
read.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(this, "Socket destroyed ...", Toast.LENGTH_LONG).show();
super.onDestroy();
}
}
이렇게 짜놓고 다른 액티비티에서는 static을 가져다가 그냥 쓰는데 에러가 계속 납니다...;; onCreate에서 startService, onDestroy에서 stopService를 실행하구요..
뭐가 문제일까요?;; 14시간째 잠도 못자고 코딩하다가 여쭤봅니다....ㅠㅜ




서비스에서 소켓을 열어서 액티버티에서 소켓을 참조하는 것은 여러모로 불안해보이네요.
소켓작업은 서비스에서 완료하고, 바인드한 액티버티에서는 그 결과를 받도록 코딩하는게 좋지 않을까 싶군요.
또는, 소켓 작업을 서비스에서 하는게 맞는지는 충분히 검토되신건가요?
단순히 UIThread 가 아닌 백그라운드에서 네트워크 작업을 하려고 하신거라면,
서비스보다는 AsyncTask 등을 사용하시는게 바람직해 보입니다.
네트워크 리퀘스트가 얼마나 많은지 모르겠지만 정말 빈번한게 아니라면 소켓을 열어두고 계속 쓰는 것보다는 필요할때마다 열고 닫는게 좋을 것 같습니다.
모바일은 네트워크가 PC만큼 안정적이지 않아 소켓이 자주 끊길테고 그때마다 재연결해주는 로직을 짜야할테니까요.