Android socket.close () вызывает «системный вызов был отменен»?

1

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, но почему?

ОБНОВИТЬ
Возможно, Dalvik распознает это как ошибку, потому что close() выбрасывает SocketExceptions на каждый поток, текущий в блоке "получать", но я не уверен, связано ли это исключение с этой проблемой.

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

  • 0
    что ты имеешь в виду почему? когда вы вызываете stopThread (), он закрывает ваш сокет в ветви else. Какие разрешения в вашем файле манифеста?
  • 0
    Он закрывает сокет, но вызывает ошибку (LogCat отображает это как ошибку), как я уже сказал. Мои разрешения - WRITE_EXTERNAL_STORAGE и INTERNET, но я не думаю, что это проблема с разрешениями, потому что почему я должен иметь возможность запустить поток тогда.
Теги:
multithreading
exception
android-lifecycle

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню