Может ли ошибка HTTP-запроса blackberry выводиться немедленно, если соединение недоступно?

StackOverflow https://stackoverflow.com/questions/825289

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть HTTP-соединение, открытое

HttpConnection c = (HttpConnection)Connector.open(url);

где url является одним из:

  • http://foo.bar;deviceside=false
  • http://foo.bar;deviceside=false;ConnectionType=mds-public
  • http://foo.bar;deviceside=true;ConnectionUID=xxxxxxx
  • http://foo.bar;deviceside=true;interface=wifi

Есть ли какой-либо способ немедленно вызвать ошибку запроса, если соединение не может быть установлено из-за того, что устройство не подключено к сети?Как бы то ни было, во многих случаях тайм-аут занимает около минуты (в частности, при первом вызове для получения информации из сети: c.getResponseCode())

Редактировать:Я имею в виду устранение ошибок.В одном случае, в частности, Wi-Fi, он будет работать в течение нескольких минут, если Wi-Fi не включен до истечения времени ожидания, и я хочу, чтобы он немедленно прекратился.

Это было полезно?

Решение

Я использую РадиоИнфо класс, чтобы проверить, есть ли соединение и включено ли радио, прежде чем пытаться установить соединение.Затем вы можете просто отобразить сообщение пользователю или включить радио (если оно выключено) перед попыткой подключения, что значительно улучшает пользовательский опыт.

Попробуйте использовать:

if (RadioInfo.getState() == RadioInfo.STATE_OFF)
OR
if (RadioInfo.getSignalLevel() == RadioInfo.LEVEL_NO_COVERAGE)

Чтобы проверить состояние соединения перед подключением.

Другие советы

Я помещаю свои сообщения в поток, чтобы ускорить время ожидания.Убедитесь, что ваш "PostThread" улавливает все исключения (и сохраняет их).

public byte[] post(String url, byte[] requestString){
    PostThread thread=new PostThread(url, requestString);

    synchronized(thread){
        try{
            thread.start();
            thread.wait(TIMEOUT);
        }catch(Throwable e){

        }//method
    }//synch

    if (thread.isAlive()){
        try{
            thread.interrupt();
        }catch(Throwable e){

        }//method
        D.error("Timeout");
    }//endif

    if (thread.error!=null) D.error(thread.error);
    if (thread.output!=null) return thread.output;
    throw D.error("No output");
}//method

Существует также ConnectionTimeout параметр, который я не тестировал:например socket://server:80/mywebservice;ConnectionTimeout=2000

Не любой способ, который может быть задан программно.Это может раздражать, но соединение с мобильного устройства, особенно BlackBerry, обычно проходит через несколько разных сетей и шлюзов, прежде чем попасть на сервер назначения:беспроводная связь-> Оператор APN-> Интернет-> BES (возможно)-> сервер foo.bar, поэтому для учета потенциальных задержек в любой из этих точек встроен большой тайм-аут.

Вы можете управлять временем ожидания подключения устройства по умолчанию с вашего сервера BES / MDS (или в JDE, из файла MDS\config impublic.property), но это, вероятно, вам не поможет.

Было бы лучше иметь проверку тайм-аута из другого потока, потому что это произойдет, даже когда соединение установлено, скажем, задержка в сети очень высока, поэтому вы не хотите, чтобы пользователь ждал так долго или что-то в этом роде.

Итак, в этом случае проверьте из другого потока, превышает ли текущее время минус время, введенное для инициализации соединения, установленное вами время, закройте соединение с помощью connection.close()!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top