如果花费太长时间,如何放弃连接尝试

时间:2011-08-17 18:04:01

标签: blackberry https timeout connection

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

它执行一个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分钟。

1 个答案:

答案 0 :(得分:1)

经过一周的研究:

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

因此,同时执行许多HttpRequests的正确方法是将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();

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