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

时间:2017-04-05 09:05:15

标签: android multithreading sockets socketexception

我有一个在后台运行的服务,它包含几个通过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!

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

read()中阻止的主题投掷IOException。这正是应该预期的行为。你关闭了套接字:它关闭了。你无法继续阅读。

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