在Android中如何停止正在等待新Socket的线程

时间:2011-02-03 20:01:28

标签: android multithreading sockets interrupt

我正在开发一个使用Socket连接到服务器的软件;

connectionThread = new Thread(new Runnable( ) {
    public void run() {
        InetAddress serverAddress = InetAddress.getByName(ip);
        serverSocket = new Socket(serverAddress, port);
        //do more stuff
        }
    });
connectionThread.start();

当客户端未连接到服务器时,线程会一直等待新Socket的返回,直到达到超时。

我想让用户取消该操作。我尝试在用户点击后退按钮时调用connectionThread.interrupt()。但线程一直在运行。

我可以让线程运行直到新的Socket超时,但我认为它不是很好。

1 个答案:

答案 0 :(得分:1)

请勿使用new Socket(serverAddress, port);。相反,首先使用new Socket()创建一个新套接字,然后使用Socket.connect()连接套接字。这样,你可以

1)指定连接的超时(将引发SocketTimeoutException)和

2)使用Socket.close()从其他线程取消该过程(SocketException将被提升)。

以下是使用此方法的代码段:

connectionThread = new Thread(new Runnable( ) {
    public void run() {
        try {
            InetAddress serverAddress = InetAddress.getByName(ip);
            serverSocket = new Socket();
            serverSocket.connect(new InetSocketAddress(serverAddress,port),TIMEOUTMS);
            //do more stuff
        } catch (SocketTimeoutException ste)
        {
            // connect() timeout occurred
        } catch (SocketException se)
        {
            // socket exception during connect (e.g. socket.close() called)
        }
    }});
connectionThread.start();