TCPソケットを介して読み書きするいくつかのスレッドを含むバックグラウンドでサービスを実行しています。ソケットを閉じてサービスを停止すると、アプリケーションがクラッシュします。クラッシュが発生する前にSocketExceptionがスローされ、コードで捕捉されます。私はなぜSocketExeptionが原因でアプリケーションがクラッシュしたのかわからない。しかし、この問題は、アンドロイド4.2で動作している私の携帯電話のいずれかでのみ発生します。アンドロイド5やアンドロア6でクラッシュすることはありません。すべてのヘルプははるかに高く評価されてスレッドを読み込むのを待っているソケットを閉じた後にアプリケーションがクラッシュする
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!
:
はここでデバッグ情報です
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();
}:以下
は、コードの一部です!
show stacktrace(SocketExceptionを取得するための複数のオプションがあります)、より多くのコードを表示します。おそらく、あなたは入力/出力ストリームや何かを閉じることができませんでした – DEADMC
今、私は質問にデバッグ情報を追加しました。私はソケットを閉じただけで、入力ストリームと出力ストリームを明示的にシャットダウンするわけではありません。しかし、私は入力と出力ストリームは、ソケットが閉じた後に自動的に閉じるべきだと思います。クラッシュはアンドロイド4.2で発生し、アンドロイド5.0または6.0では問題ありません。 – user1870797
ソケットがすでに閉じられているかどうか、close()の前に確認してください。 – DEADMC