В Android как остановить поток, который ждет новый сокет - PullRequest
2 голосов
/ 03 февраля 2011

Я разрабатываю программное обеспечение, которое подключается к серверу с помощью сокета;

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

Когда клиент не подключается к серверу, поток продолжает ожидать возврата нового сокета до истечения времени ожидания.

Я хочу, чтобы пользователь мог отменить это действие. Я попытался тогда позвонить connectionThread.interrupt(), когда пользователь нажимает кнопку возврата. Но поток продолжает работать.

Я мог бы позволить потоку работать до нового времени ожидания Socket, но я думаю, что это не очень хорошо.

1 Ответ

1 голос
/ 26 ноября 2011

Не используйте 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();
...