【问题标题】:How to abandon a connection attempt if it takes too long如果连接时间过长,如何放弃连接尝试
【发布时间】:2011-08-17 18:04:00
【问题描述】:

我有一个我编写的应用程序可以在模拟器中完美运行。当我把它放在设备上时它没有。

它执行一个 HttpRequest 来获取和解析所有包含我要下载的缩略图的所有 url 的 xml。一旦完成所有这些并关闭线程,它将创建一个新线程,该线程循环遍历所有 url 并请求/下载缩略图(每个 XML 请求一次 7 个)。它适用于前 14-28 次下载,然后一两次会失败。我的问题是,我怎样才能得到代码:

_connFact.setAttemptsLimit(2);
_connFact.setRetryFactor(500);
_connFact.setTimeLimit(500);
_connFact.setConnectionTimeout(2000);
_connFact.setTimeoutSupported(true);
        //Hangs on the line below for 2-5 minutes on the ones that it failed to download
        //trans[i] is just a list of Transports that I've prechecked for coverage and availability
    for (int i = 0; i < trans.length; i++){
        _httpsConn = (HttpsConnection)_connFact.getConnection(URLFactory.EncodeUrl(trans[i], _url), trans[i], null).getConnection();
        if (_httpsConn != null){
        break;
        }
    }

如果连接失败就死掉。我宁愿让应用程序继续并显示损坏的缩略图,然后在每次失败时挂起 2 分钟以上。

【问题讨论】:

  • 从未在黑莓上编程,但在我看来你应该创建 2 个工厂。 1 第一个请求超时,长超时,其他缩略图请求不重试。
  • 此代码仅用于缩略图请求。我调用这个函数 7 次,_url 是每个缩略图的位置
  • @DFTR:+1。尽管_connFact.setConnectionTimeout(2000);(2 秒超时)它仍然需要 2+ 分钟...我有你描述的相同问题(我不使用ConnectionFactory,但我使用Connector.open(url) 来获得HttpConnection) .当我进行批量图像下载(我一张一张地下载图像 - 每个图像使用自己的新连接)时,有时(大约十个请求)它会挂起 2+ 超时。我仍然不知道为什么会发生这种情况以及如何解决它。即使在模拟器上也会发生这种情况,BB 传输是 100% 永久可用的。
  • 它也用尽了可用的设备连接。无论您的交通工具是什么(wifi、3g 等),您都不能做任何事情,直到您等待 2-5 分钟,或者回收收音机。我很想拥有一个新的 9850 或其他东西,看看 BBOS7 是否这样做。
  • @DFTR:你知道吗.. 我有一个想法可以尝试 - 如果你在开始新下载之前设置 1 或 2 秒延迟(当然是在非 UI 主题上)怎么办?这是为了确保操作系统有足够的空闲时间来释放它可能仍为已执行的连接保留的所有资源。

标签: blackberry https timeout connection


【解决方案1】:

经过一周的研究:

众所周知,HttpConnection 是阻塞的。当一个接一个地执行许多 HttpRequest 时,黑莓无法处理它。最终会失败。这是一个问题,因为 ConnectionTimeout=Value 标志是 only supported with MDS / BES connections。因此连接不会超时并继续阻塞。不幸的是,这也阻止了其他应用程序(包括浏览器等)的工作。默认超时为 1 天,这意味着解决此问题的唯一方法是回收收音机。

因此,同时执行多个 HttpRequest 的正确方法是使用 NonBlockingSenderDestination 和应用程序连接工厂上下文,并实现一个单独的 MessageListener:

    _factory = new ConnectionFactory();
        _factory.setAttemptsLimit(3);
        if (DeviceInfo.isSimulator()) {
            _factory.setPreferredTransportTypes(new int[] { TransportInfo.TRANSPORT_TCP_WIFI,
                    TransportInfo.TRANSPORT_TCP_CELLULAR });
        }

        _context = new Context("yourappname", _factory);

NonBlockingSenderDestination destination = DestinationFactory.createNonBlockingSenderDestination(_context,
                    URI.create(url), this);
            destination.send();

这是正确的做法,因为您不能放弃传统的 HttpConnection,除非它是 MDS 连接。然后,这允许操作系统处理它并且应用程序侦听响应。如果没有响应,则被操作系统放弃。

【讨论】:

  • "默认超时为 1 天".. 你确定吗?有这方面的“官方”信息吗?我的经验是 2 分钟以上。
  • 时间限制:1 天尝试限制:1 抱歉。这就是我的意思。其用于连接工厂
猜你喜欢
  • 2016-05-10
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多