2

我有一个定时器任务,它在触发时关闭连接,问题是有时它在连接实际打开之前被触发,如下所示:

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。

4

1 回答 1

2

连接存在于不同的线程中,并且有自己的生命周期。您正在尝试以同步方式从计时器线程访问它。

首先,连接是一个状态机。它从“设置”状态开始,然后如果在其上调用某些方法(任何需要联系服务器的方法),则更改为“已连接”状态,最后在连接完成后更改为“关闭”状态由服务器或客户端终止。该方法getResponseCode是可以导致连接从所谓的“设置”状态转换为“已连接”状态的方法之一,如果它尚未连接的话。您正在尝试立即获取响应代码,甚至不知道连接是否已建立。您甚至没有让连接时间正确连接或关闭。即使可以,也请查看 javadocs 对该close方法的评价:

当一个连接被关闭时,访问它的任何方法,除了这个 close() 将导致一个 IOException 被抛出。

如果您在关闭后确实需要做某事,请将“侦听器”对象传递给连接,以便它可以在连接关闭时回调,并返回响应代码(如果与服务器的连接曾经成立)。

于 2013-03-05T17:14:39.327 回答