È possibile che un blackberry HTTP richieda immediatamente un errore se non è disponibile alcuna connessione?
-
05-07-2019 - |
Domanda
Ho una connessione HTTP, aperta da
HttpConnection c = (HttpConnection)Connector.open(url);
dove url
è uno di:
-
http: //foo.bar; deviceside = false
-
http: //foo.bar; deviceside = false; ConnectionType = MDS-pubblico
-
http: //foo.bar; deviceside = true; ConnectionUID = xxxxxxx
-
http: //foo.bar; deviceside = true; interface = wifi
Esiste un modo per causare immediatamente la richiesta di errore se la connessione non può essere stabilita perché il dispositivo non è connesso a una rete? Allo stato attuale, in molti casi ci vuole circa un minuto per il timeout (in particolare alla prima chiamata per ottenere le informazioni dalla rete: c.getResponseCode ()
)
Modifica: intendo errore fuori. In un caso, Wifi, in particolare, rimarrà in piedi per diversi minuti se il wifi non è attivo prima del timeout e voglio che si fermi immediatamente.
Soluzione
Uso RadioInfo per verificare se esiste una connessione e se la radio è accesa prima di provare a stabilire una connessione. Quindi puoi semplicemente visualizzare un messaggio per l'utente o accendere la radio (se è spenta) prima di provare a connetterti, per un'esperienza utente molto migliore.
Prova a usare:
if (RadioInfo.getState() == RadioInfo.STATE_OFF)
OR
if (RadioInfo.getSignalLevel() == RadioInfo.LEVEL_NO_COVERAGE)
Per verificare lo stato della connessione prima della connessione.
Altri suggerimenti
Ricopro i miei post in una discussione per un timeout più veloce. Assicurati che il tuo " PostThread " cattura tutte le eccezioni (e le salva).
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
Esiste anche il parametro ConnectionTimeout
, che non ho testato: ad es. socket://server:80/mywebservice;ConnectionTimeout=2000
Non è possibile specificare in modo programmatico. Può essere irritante, ma una connessione da un dispositivo mobile - specialmente un BlackBerry - passa generalmente attraverso alcune reti e gateway diversi prima di raggiungere il server di destinazione: wireless- > Carrier APN- > Internet- > BES (forse) - > foo.bar server, quindi è incorporato un timeout di grandi dimensioni per tenere conto di potenziali ritardi in uno di questi punti.
Puoi controllare il timeout di connessione del dispositivo predefinito dal tuo server BES / MDS (o in JDE, dal file MDS \ config \ rimpublic.property) - ma probabilmente non ti aiuterà.
Sarebbe meglio avere un controllo di timeout da un thread diverso, poiché ciò accadrà anche quando viene stabilita la connessione, ad esempio la latenza della rete è molto alta, quindi non vuoi che l'utente aspetti così a lungo o così cosa.
Quindi, in tal caso, verifica da un thread diverso, se l'ora corrente meno l'ora immessa per l'avvio della connessione è superiore al tempo impostato, chiudi la connessione utilizzando connection.close ()!