현재 안드로이드 프로그램 개발중인데요..

소켓은 싱글톤 방식으로 관리하고있습니다.

그리고 소켓에 들어오는 메시지를 감시해서 이 메시지가 모두 도착했을때 ('n'이 왔을 때까지)메시지를 현재 액티비티에 옮겨주는것이 목적입니다.


그러기 위해서 핸들러를 사용하고있는데요.

이게 소켓을 관리하는 클래스 입니다.

public class SocketManager {
    
    public final static String HOST = "xxxx";
    public final static int PORT = xxxxx;
    
    private static Socket socket;
    
    public static Socket getSocket() throws IOException
    {
        if( socket == null)
            socket = new Socket();
        
        if( !socket.isConnected() || socket.isClosed())
        {
            Log.w("socketManager.getSocket","socket not connect || is Closed");
            socket.connect(new InetSocketAddress(HOST, PORT));
        }
        
        return socket;
    }
    
    public static void closeSocket() throws IOException
    {
        if ( socket != null )
            socket.close();
        
        socket = null;
    }
    
    public static void sendMsg(String msg) throws IOException
    {
        getSocket().getOutputStream().write((msg + '\n').getBytes());
    }
    
}

소켓리스너 클래스입니다.
public class SocketListener extends Thread{
    
    private InputStream im;
    private BufferedReader br;
    
    Handler mHandler ;
    
    Context context;
    
    public SocketListener(Handler handler) {
        this.mHandler = handler;
        
        getConnection();
        
    }
    
    private void getConnection()
    {
        try {
            im = SocketManager.getSocket().getInputStream();
            br = new BufferedReader(new InputStreamReader(im));
        } catch (IOException e) {
            Log.e("SocketListener.getConnection", e.getMessage());
        }

    }
    
    @Override
    public void run() {
        super.run();
        
        while(true)
        {
            try {
                String receivedmsg;
                
                if(br == null)
                {
                    Log.e("SocketListener.run","br is null");
                    getConnection();
                }
                
                while((receivedmsg = br.readLine())!= null)
                {
                    Log.e("SocketListener", receivedmsg);
                    Message msg = Message.obtain(mHandler, 0,0,0,receivedmsg);
                    mHandler.sendMessage(msg);
                }
            } catch (IOException e) {
                getConnection();
            }
        }
        
    }

}




1번 액티비티 입니다. (root 액티비티)
public class Activity1 extends Activity {
    private Handler handler;
    private SocketListener sl;

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
       
       this.getMessage();
        
    }

    private void getMessage()
    {
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                messageHandler(msg.obj.toString()); //메시지 처리 루틴은 다른 메서드로 구현했습니다.
            }
        };

        sl = new SocketListener(handler);
        sl.start();
    }
}


2번 액티비티입니다.
public class MapViewer extends MapActivity{

    private SocketListener sl;
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            
            messageHandler(msg.obj.toString());
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
       
       this.getMessage();
        
    }

    private void getMessage()
    {
        sl = new SocketListener(handler);
        sl.setDaemon(true);
        sl.start();
    }

}




간략하게 설명하면 소켓리스너라는 클래스를 각 액티비티 마다 생성해서 문제를 해결하려했습니다.

어플이 실행되고 root 액티비티가 생성되면 root 액티비티에서 핸들러를 생성하고 이 핸들러를 인자로하는 소켓리스너 객체를 생성하는 방식으로 소켓의 inpustream에 대한 메시지를 현재의 액티비티로 가져오려고했습니다.

여기까지는 문제 없는데

root액티비티에서 2번째 액티비티를 호출하게 되면 root 액티비티의 소켓리스너 객체가 살아있는게 문제 입니다. root 액티비티의 소켓리스너가 객체가 쓰레드를 상속받다보니 stop()메서드가 있기에 이거를 호출해서 멈추려고해도 안되더군요. 이게 제가 안드로이드 시스템을 잘 파악하지 못하고 사용해서 그런것 같긴 합니다만..


2번째 액티비티가 실행중일때 메시지가 첫번째로 들어오면 root 액티비티의 핸들러가 메시지를 받고 두번째 메시지부터는 2번째액티비티의 핸들러가 받긴한데 , 메시지가 한번 더오면 핸들러가 먹통이 되더군요 (-_ㅠ 뭐가뭔지 모르겠네요 고수님들 도움 부탁드리빈다.