Android: завершение потока с помощью сокета - PullRequest
2 голосов
/ 19 октября 2011

У меня есть поток, который используется для поддержания соединения с сервером. Если пользователь выходит из службы в приложении (но не выходит из приложения), мне нужен способ завершить поток и убедиться, что он действительно пропал. В существующем состоянии соединение с сервером осуществляется посредством длительного опроса (a.k.a, архитектура Comet). Если я использую «прерывание» для завершения потока, основное соединение с сервером все еще установлено. Нить всегда остается в памяти. Кажется, нет никакого способа заставить сокет закрыться.

Если пользователь снова войдет в систему сразу после выхода, к серверу будет установлено новое соединение. Однако старое соединение все еще активно из-за того, что сокет не был освобожден. Я обнаружил, что если я захожу в «Настройки Android»> «Приложения»> «Управление приложениями» и заставляю приложение закрывать и перезапускать его, поток соединения фактически прерывается, и у меня не возникает проблем с подключением к серверу снова.

Есть ли какой-нибудь способ прекратить поток после выхода из системы, чтобы он действительно был прерван? Использование System.GC () не помогает.

1 Ответ

0 голосов
/ 19 октября 2011

Что я делаю, это добавляю логический флаг с именем killRequest или что-то, что включено в длительный цикл.Например:

//long running loop in thread:
while (someMainLoopCondition && !killRequest)
{
     //do stuff;

}

Также создайте метод для изменения флага внутри потока:

public requestTermination()
{
     killRequest = true;
}

Затем вы можете вызвать

myThread.requestTermination();

или создать методдля очистки:

private void KillNetworkThread(boolean b)
            {
                    if (nThread != null) { // If the thread is currently running, close the socket and interrupt it.
                            try {
                                    nThread.requestTermination();
                                    nis.close();
                                    nos.close();
                                    nsocket.close();
                            } catch (Exception e) {
                            }
                            Thread moribund = nThread;
                            nThread = null;
                            moribund.interrupt();
                    }

            }

Это, наконец, решило мою давнюю проблему потока.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...