2015-09-09 15 views
9

をお読みください。 私はは、私は自分のアプリケーションでAsyncTaskを持ってAsyncTask

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK) { 
      task.cancel(true); 
      mySocket.close(); 
      finish(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

isCancelled()をチェックするために、ここでAndroid - Cancel AsyncTask Forcefully答えをしようとしたが、task.cancle(true)が呼び出されたときに、そのアプリケーションがmyInputstream.read(readbyte)でブロックするようです。 Androidは「アプリは応答を停止します..」というポップアップを表示します。 ブロッキングの読み取りを強制的に停止するにはどうすればよいですか?

+0

doInBackgroundで例外をキャッチしますか? InterruptedExceptionが存在するはずです。 – Fildor

+0

@Fildor 'java.io.InterruptedIOException'でなければなりませんが、ストリームが中断をサポートしている場合に限ります。 – SpaceTrucker

+0

あなたは「アプリケーションが 'myInputstream.read(readbyte)'でブロックするようです。あなたは本当にそれが事実ですか? – SpaceTrucker

答えて

0

java.io.InputStreamは、ブロッキングI/Oを実装します。 read操作がそこにはより多くのデータが(それが閉じられたか、接続が終了したとして)ストリームから読み込まれていないか、例外をスローすることを意味-1を返しますまで、アプリケーションが

myInputstream.read(readbyte) 

をブロックすることが期待されます。

ストリーム上のデータを待っているスレッドのブロックを解除する唯一の方法は、ストリームを閉じることです。あなたの場合は、

mySocket = new Socket(); 

行で作成されたSocketを閉じることができる必要があります。

mySocket.close(); 

は読書を中断するはずです。しかし、実際にはSocket.close()と認識しておいてください。

このソケットを閉じます。

このソケットでI/O操作で現在ブロックされているスレッドは、SocketExceptionをスローします。

だからタスクトレッドがブロックされていないでしょうが、あなたは(は多分これはあなたがが欠落しているものである)すべての操作を終了するために、あなたのタスクに正しくSocketExceptionを処理する必要があります。 FYIこれが唯一のタスクにcancelledフラグを設定するとあまり意味がありません

task.cancel(true); 

を呼び出す

。フラグをチェックし、I/Oをブロックすることで、それを行う可能性がないことは、コードの責任です。

また、ノンブロッキングI/Oの使用を検討する必要があります。

関連する問題