Stop HandlerThread, в котором есть блокирующий вызов - PullRequest
0 голосов
/ 15 октября 2019

Я делаю сетевой запрос по TCP / IP и слушаю ответ в отдельном потоке. Каждый раз, когда я выполняю сетевой вызов, я хочу остановить предыдущий поток, который прослушивает ответ, и создать новый.

К сожалению, старый HandlerThread не завершается перед запуском нового.

            if (mHandler != null) {
                mHandler.getLooper().quit();
            }
            if (mHandlerThread != null) {
                mHandlerThread.interrupt();
                mHandlerThread.quit();
            }
            mHandlerThread = new HandlerThread("socket-reader-thread");
            mHandlerThread.start();
            mHandler = new Handler(mHandlerThread.getLooper());
            mHandler.post(() -> {
                try {
                    String line;
                    while ((line = mBufferedReader.readLine()) != null) // BLOCKING CALL
                    {
                        ...
                    }
                    mBufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });

Есть ли способ прекратить эти HandlerThread с?

Threads not getting terminated and piling

1 Ответ

1 голос
/ 11 ноября 2019

mHandlerThread.quit(); эта строка кода просто выйдет из петли потока обработчика, это не значит, что она немедленно завершает поток, потому что вы публикуете сообщение, которое выполняется в цикле while. Если сообщение в то время как цикл не останавливается, mHandlerThread не остановится навсегда. так что вы можете изменить свой код следующим образом:

mHandler.post(() -> {
    try {
        String line;
        while (!mHandlerThread.isInterrupted && (line = mBufferedReader.readLine()) != null)
        {
            ...
        }
        mBufferedReader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
});

просто добавьте !mHandlerThread.isInterrupted() как объединенное условие цикла.

Кстати, вам не нужен вызов:if (mHandler != null) { mHandler.getLooper().quit(); } но mHandlerThread.interrupt(); необходимо!

...