Как отказаться от попытки подключения, если это занимает слишком много времени - PullRequest
2 голосов
/ 17 августа 2011

У меня есть приложение, которое я написал, которое отлично работает в симуляторе. Когда я помещаю это в устройство, однако, это не делает.

Он выполняет один запрос HttpRequest, чтобы получить и проанализировать весь XML-файл, содержащий все URL-адреса эскизов, которые я хочу загрузить. Как только все это будет сделано и поток будет закрыт, он создаст новый поток, который просматривает все URL-адреса и запрашивает / загружает миниатюры (по 7 за каждый запрос XML). Он отлично работает для первых 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 Ответ

1 голос
/ 21 августа 2011

После недели исследований:

HttpConnection, как известно большинству, блокирует.При выполнении многих запросов Http один за другим ежевика испытывает проблемы с обработкой.В конце концов один потерпит неудачу.Это проблема, потому что флаг ConnectionTimeout = Value поддерживается только для соединений MDS / BES .Таким образом, соединение не прерывается и продолжает блокировку.К сожалению, это также блокирует работу других приложений (включая браузер и т. Д.).Время ожидания по умолчанию равно 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.Это позволяет ОС обрабатывать его, а приложение ожидает ответа.Если ответ не поступает, ОС отказывается от него.

...