Android socket.close () вызывает "системный вызов был отменен"? - PullRequest
1 голос
/ 22 января 2012

My MainActivity запускает другой поток с именем UdpListener. В onResume поток будет запущен (это работает), в onPause он должен остановиться, но socket.close () вызывает сообщение об ошибке в LogCat «, системный вызов был отменен ». Сам UdpListener отлично работает в тестах JUnit, так что это должно быть какая-то проблема с Android.

Это соответствующие методы моей темы:

private void setThreadRunning(boolean running) throws MyOwnException {
    this.running = running;

    if (running) {
        try {
            serverSocket = new DatagramSocket(9800);
        } 
        catch (SocketException e) {
            exceptionThrown = true;
            this.running = false;
            Log.e(TAG, e.getMessage());

            if (serverSocket != null && !serverSocket.isClosed())  {
                serverSocket.close();
            }

            throw new MyOwnException(e);
        }
    } 
    else {
        if (serverSocket != null && !serverSocket.isClosed())  {
            serverSocket.close();
        }
    }
}

public void stopThread() throws MyOwnException {
    setThreadRunning(false);
}

MainActivity.onPause ():

@Override
public void onPause()  {
    super.onPause();

    try {
        udpListener.stopThread();
    } 
    catch (MyOwnException e) {
        //TODO AlertDialog
    }
}

serverSocket.close () из ветви else будет выполнен и вызывает запись LogCat, но почему?

UPDATE
Может быть, Dalvik распознает это как ошибку, потому что close () создает исключения SocketExceptions для каждого потока, который в данный момент находится в блоке «receive», но я не уверен, связано ли это исключение с этой проблемой.

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/DatagramSocket.html#close()

1 Ответ

0 голосов
/ 22 января 2012

Когда я окружаю вызов receive () в методе run с помощью SocketException try..catch, ошибка больше не возникает. Я предполагаю, что моя обработка исключений имела некоторый побочный эффект, чтобы вызвать эту ошибку.

...