关闭套接字等待线程读取后应用程序崩溃



>我有一个在后台运行的服务,其中包含多个通过TCP套接字读取和写入的线程。关闭套接字并停止服务后,我的应用程序崩溃。在崩溃发生之前,我的代码抛出并捕获了一个 SocketException。我不知道为什么 SocketExeption 会导致我的应用程序在已经被捕获时崩溃。但是此问题仅发生在我在android 4.2上运行的一部手机中。到目前为止,在android 5或andoird 6上没有发生崩溃。

下面是代码的一部分:

public void logout() throws IOException {
this.userName = "";
listenerService.p_status=false;
listenerService.p_Thread.interrupt();
listenerService.c_status=false;
listenerService.c_Thread.interrupt();
listenerService.closeSocket();
unbindService(mConnection);
listenerService.stopService();

}

以下是调试信息:

04-05 17:36:49.635 28101-28691/com.androidapp.ptt I/System.out: SOCKET CLOSED!
04-05 17:36:49.635 28101-28691/com.androidapp.ptt W/System.err: java.net.SocketException: Socket closed
04-05 17:36:49.635 28101-28691/com.androidapp.ptt W/System.err:     at libcore.io.Posix.recvfromBytes(Native Method)
04-05 17:36:49.635 28101-28691/com.androidapp.ptt W/System.err:     at libcore.io.Posix.recvfrom(Posix.java:142)
04-05 17:36:49.640 28101-28699/com.androidapp.ptt I/System.out: 404:kukukukukukuku
04-05 17:36:49.640 28101-28691/com.androidapp.ptt W/System.err:     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
04-05 17:36:49.640 28101-28691/com.androidapp.ptt W/System.err:     at libcore.io.IoBridge.recvfrom(IoBridge.java:499)
04-05 17:36:49.640 28101-28691/com.androidapp.ptt W/System.err:     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
04-05 17:36:49.640 28101-28691/com.androidapp.ptt W/System.err:     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
04-05 17:36:49.645 28101-28691/com.androidapp.ptt W/System.err:     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
04-05 17:36:49.645 28101-28691/com.androidapp.ptt W/System.err:     at java.io.InputStream.read(InputStream.java:162)
04-05 17:36:49.645 28101-28691/com.androidapp.ptt W/System.err:     at com.androidapp.ptt.ListenerService$2.run(ListenerService.java:439)
04-05 17:36:49.645 28101-28691/com.androidapp.ptt W/System.err:     at java.lang.Thread.run(Thread.java:841)
04-05 17:36:49.685 28101-28101/com.androidapp.ptt I/System.out: Service done!

任何帮助都非常感谢!

read() 中被阻塞的线程抛出了一个IOException。这正是应该预期的行为。您关闭了插座:它已关闭。您无法继续阅读。

如果您想要一种很好的方法来终止该线程,请在套接字上调用 shutdownInput() 而不是关闭它。这将导致读取线程解锁,感知流的结束,如果写入正确,则停止读取并关闭套接字。

最新更新