我有一个我写的应用程序在模拟器中完美运行。当我把它放在一个设备上但它没有。
它执行一个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分钟。
答案 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。然后,允许操作系统处理它,应用程序侦听响应。如果没有响应,那么操作系统就会放弃它。