在我的Android应用程序中,我的活动正在为一些套接字网络操作启动另一个线程,并且此线程始终在等待来自套接字的传入数据(在dev
循环中阻塞read()
函数)
现在,当我的活动被破坏时,我想保持清洁,并销毁该线程。为了实现此功能,我定义了一个while
变量volatile boolean
,该变量将初始化为isSupposedToStop
,当false
被调用时,它会将onStop()
设置为{ {1}},调用导致boolean
上的线程阻塞的true
抛出socket.shutdownInput()
,然后读取read()
布尔值,知道是假设的停止。(如果你有更好的方式随时讨论它)。
所以,在我连接套接字后的IOException
实现中,我有:
isSupposedToStop
在run()
中,我有:
sock= new Socket("127.0.0.1", 1234);
InputStream is= sock.getInputStream();
byte[] buffer= new byte[200];
while(true){
if(isSupposedToStop) return;
try {
is.read(msgSizeBuff, 0, 200);
} catch(IOException e){
}
if(isSupposedToStop) return;
//do something with the received message
}
运作良好。当线程正在等待新数据(阻止onStop()
)时,isSupposedToStop= true;
if(sock!= null) {
try {
sock.shutdownInput();
sock.close();
} catch (IOException e) {
}
}
thread.join()
会在read()
调用read()
时立即引发IOException
,并且控件又回到读取我的布尔值并退出的线程。
但是如果在线程仍在等待建立连接时调用onStop()
(shutdownInput()
上的阻塞),则会发生问题,因此如果主机关闭,例如应用程序冻结约3秒,那么你建议只省略onStop()
电话?或者有没有办法唤醒这个线程?
答案 0 :(得分:3)
一旦你调用read
方法就基本上被阻止了 - 你只能通过中断线程来逃避。
public void test() {
Thread socketThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
});
// Do your stuff.
//...
// Time to quit - should abort any blocked reads.
socketThread.interrupt();
}
另一种选择 - 这可能根本不起作用 - 是使用available
的{{1}}方法。
InputStream
答案 1 :(得分:1)
新的Socket不应该阻止网络。甚至不是SYN / ACK。
因此,您可以在构建后立即设置SOTimeout()。但是,为了公平起见,你不会把它设置为不到3秒。
你建议响应一个socket.close()需要3秒钟......所以我担心它不能更快,但你可以尝试一个thread.interrupt(),以防它处于可中断状态(非本地)代码。