我有一个计时器任务,当它被触发时关闭一个连接,问题是有时它会在连接实际打开之前被触发,如下所示:
try {
HttpConnection conn = getMyConnection(); // Asume this returns a valid connection object
// ... At this moment the timer triggers the worker wich closes the connection:
conn.close(); // This is done by the timeTask before conn.getResponseCode()
int mCode = conn.getResponseCode(); // BOOOMMMM!!!! EXPLOTION!!!!
// ... Rest of my code here.
} catch(Throwable e) {
System.out.println("ups..."); // This never gets called... Why?
}
当我尝试conn.getResponseCode()
时,会抛出异常,但不是咳嗽,为什么?
我收到此错误:ClientProtocol(HttpProtocolBase).transitionToState(int)
行:484,找不到来源:S。
答案 0 :(得分:2)
连接存在于不同的线程中,并且具有自己的生命周期。您正尝试以同步方式从计时器线程访问它。
首先,连接是状态机。它始于"设置"状态,然后改为"连接"如果调用某些方法(任何需要联系服务器的方法),最后它改为"关闭"当服务器或客户端终止连接时的状态。方法getResponseCode
是可以导致连接从所谓的"设置"转换的方法之一。陈述到"连接"状态,如果它还没有连接。您试图立即获取响应代码,甚至不知道连接是否已建立。您甚至没有让连接时间正确连接或关闭。即使你可以,看看javadocs对close
方法的评价:
当连接关闭时,访问除此close()之外的任何方法都将导致抛出IOException。
如果你真的需要在关闭后做一些事情,那么通过一个"听众"对象连接,以便它可以在连接关闭时回调,并传回响应代码(如果与服务器的连接已经建立)。