2017-04-05 5 views
0

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(); 

}:以下

は、コードの一部です!

+0

show stacktrace(SocketExceptionを取得するための複数のオプションがあります)、より多くのコードを表示します。おそらく、あなたは入力/出力ストリームや何かを閉じることができませんでした – DEADMC

+0

今、私は質問にデバッグ情報を追加しました。私はソケットを閉じただけで、入力ストリームと出力ストリームを明示的にシャットダウンするわけではありません。しかし、私は入力と出力ストリームは、ソケットが閉じた後に自動的に閉じるべきだと思います。クラッシュはアンドロイド4.2で発生し、アンドロイド5.0または6.0では問題ありません。 – user1870797

+0

ソケットがすでに閉じられているかどうか、close()の前に確認してください。 – DEADMC

答えて

1

read()でブロックされたスレッドは、IOExceptionを投げました。これはまさに期待されるべき行動です。あなたはソケットを閉じました:それは閉じています。あなたは読書を続けることはできません。

スレッドを終了させるには、ソケットの代わりにshutdownInput()を呼び出します。これにより、読み込みスレッドのブロックが解除され、ストリームの終わりが認識され、正しく書き込まれていれば、ソケットの読み込みと終了が停止されます。

+0

ありがとう、あなたの説明は多くの助けになります。例外をスローするよりも、shutdownInput()によってread()をブロック解除する方が良いです。私のコードは正しくスレッドを停止せず、ソケットを閉じませんでした。 Exception.printStackTrace()を呼び出すと、複数のスレッドの予期しない実行順序が原因で、キャッチされない例外が発生する可能性があります。 Excetpion.printStackTrace()は、これらのスレッドを含むサービスが別のスレッドによって終了された後に呼び出され、アプリケーションのクラッシュを引き起こします。 – user1870797

関連する問題