【问题标题】:Finally with callback listeners最后是回调监听器
【发布时间】:2017-05-24 14:02:48
【问题描述】:

所以,我有以下代码:

try{
....
    if(serverResp.isSucces()){
      callbackListener.onDataLoaded(serverResp);
    }

 }catch(Exception e){
 //...do whatever I have to
}finally{
  urlConnection.disconnect();
}

我的问题是,何时调用 urlConnection.disconnect?大多数带有 finally 的示例解释了在 return 的情况下何时调用它。我理解这种情况,但在这里我没有回报,只能打电话给听众。 在大多数情况下,侦听器回调会触发一个新的 Activity 启动。我想确定,我之前的所有连接都已关闭!

所以主要问题是:

  • finally get调用时,如果没有return,只有listener回调?
  • 这是关闭 urlConnection 的正确方法吗?

【问题讨论】:

  • 不,这个用return解释
  • 我认为做一些测试看看它是否被调用会很容易。
  • 最后被调用 1) 正常执行没有错误,2) try 块出错 3) catch 块也出错
  • 好的,但是如果监听器启动一个持续 10 分钟的循环会怎样。 finally 是在那 10 分钟之后还是之前执行的?

标签: java android try-catch


【解决方案1】:

finally 是关闭资源的最佳位置。

finally 块在try/catch 块退出点之后执行。这发生在:

  1. 到达try 块的末尾
  2. try 块以任何其他方式退出(break 退出外循环,return,抛出未捕获的异常等)
  3. 捕获到异常并执行到catch 块的末尾
  4. 执行此代码的线程已终止。

finally 可能不会被执行的唯一时间描述为here

在您的情况下,假设没有抛出异常,您的回调将在连接关闭之前执行。回调完成后连接将关闭(通过完全执行或委托给其他线程)。

请注意,disconnect 可能只是确保在较新版本的 Java 中关闭连接的安全方法。您通常会尝试读取整个响应,然后关闭输入流。你可以在这个网站上找到很多关于这个的讨论。

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2017-06-11
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多