0

我正在通过 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();
                }
            });

有没有办法终止这些HandlerThreads?

线程没有被终止和堆积

4

1 回答 1

1

mHandlerThread.quit();这行代码只会退出处理程序线程的循环器,这并不意味着它会立即终止线程,因为您发布了一条执行 while 循环的消息。如果消息 while 循环没有停止,则 mHandlerThread 不会永远停止。所以你可以像这样改变你的代码:

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

只需添加!mHandlerThread.isInterrupted()为组合的 while 循环条件。

顺便说一句,你不需要 call:
if (mHandler != null) { mHandler.getLooper().quit(); } 但这mHandlerThread.interrupt();是必要的!

于 2019-11-11T11:45:27.307 回答