【发布时间】:2015-09-09 10:48:31
【问题描述】:
我的应用程序中有一个 AsyncTask:
public class myActivity extends Activity {
private static Socket mySocket;
private static InputStream myInputstream;
private AsyncTask task;
private boolean connected = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
task = new UpdateTask().execute();
...
}
private class myTask extends AsyncTask<Void, String, String> {
@Override
protected String doInBackground(Void... v) {
if(!connected) {
try {
mySocket = new Socket();
mySocket.connect(new InetSocketAddress(MYIP, MYPORT));
myInputstream = mySocket.getInputStream();
connected = true;
} catch(IOException e) { ... }
}
while(connected && !isCancelled()) {
byte[] readbyte = new byte[1024];
try {
myInputstream.read(readbyte);
} catch (IOException e) { ... }
...
}
return null;
}
...
}
当我关闭我的应用程序时,我想停止 AsyncTask task:(按返回按钮)。
我在这里尝试了Android - Cancel AsyncTask Forcefully的答案以检查isCancelled()
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
task.cancel(true);
mySocket.close();
finish();
}
return super.onKeyDown(keyCode, event);
}
但是当调用task.cancle(true) 时,应用程序似乎会在myInputstream.read(readbyte) 处阻塞。
Android 会弹出一个“应用程序停止响应..”给我。
如何强制停止阻塞读取?
【问题讨论】:
-
您是否在 doInBackground 中发现任何异常?应该有一个 InterruptedException。
-
@Fildor 它应该是
java.io.InterruptedIOException,但前提是流支持中断。 -
您说“应用程序似乎将在
myInputstream.read(readbyte)处阻塞”。你有多大把握确实是这样? -
因为行间用了很多
Log.d()打印,所以停在read(readbyte) -
mySocket.connect(new InetSocketAddress(MYIP, MYPORT));。你不能在 onCreate 中这样做。使用 AsyncTask 的整个想法是将这样的“互联网代码”放在 AsyncTask 的 doInBackground 中。
标签: java android sockets android-asynctask