Может ли ошибка HTTP-запроса blackberry выводиться немедленно, если соединение недоступно?
-
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()!