gpt4 book ai didi

java - 强制停止阻塞读取 AsyncTask

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:22 25 4
gpt4 key购买 nike

我的应用程序中有一个 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 会向我弹出“应用程序停止响应..”弹出窗口。如何强制停止阻塞读取?

最佳答案

java.io.InputStream 实现阻塞 I/O。预计您的应用程序将阻塞于

myInputstream.read(readbyte)

直到 read 操作将返回 -1 ,这意味着没有更多数据可从流中读取(因为它已关闭或连接已终止)或抛出异常.

解除阻塞等待流中数据的线程的唯一方法是关闭它。在您的情况下,您需要能够关闭在

中创建的 Socket
mySocket = new Socket();

行。

mySocket.close();

应该打断你的阅读。但请注意 Socket.close()实际上

Closes this socket.

Any thread currently blocked in an I/O operation upon this socket will throw a SocketException.

因此您的任务进程将畅通无阻,但您必须在任务中正确处理 SocketException 以终止所有操作(也许这就是您所缺少的)。

仅供引用

task.cancel(true);

没有多大意义,因为这只会在任务上设置 cancelled 标志。检查标志是您的代码的责任,对于阻塞 I/O,您不可能这样做。

或者,您应该考虑使用非阻塞 I/O。

关于java - 强制停止阻塞读取 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32477489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com