Verifica continua della connessione

di il
13 risposte

Verifica continua della connessione

Salve, nel mio programma mi serve avere una verifica costante della connessione.

Per verificarla una volta ho usato:
 public void verificaConnessione() {

        ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = connManager.getActiveNetworkInfo();

        if (netInfo != null && netInfo.isConnected()) {

            //connesso

        }else{
               //connessione persa
        }
    }
Come faccio a verificarla di continuo in background? Grazie.

13 Risposte

  • Re: Verifica continua della connessione

    anonimo ha scritto:


    nel mio programma mi serve avere una verifica costante della connessione.
    [...]
    Come faccio a verificarla di continuo in background? Grazie.
    Qualunque cosa sia costante o continuo in background all'interno di un app mobile è assolutamente da evitare, pena causare un "battery drain" del dispositivo, ossia lo scaricamento doloso e vertiginoso della batteria.

    Qual è l'utilità di una simile funzione?
  • Re: Verifica continua della connessione

    Servirebbe per avvertire l'utente in tempo reale che è stata persa la connessione.
    Molte applicazioni hanno questa funzione, consumerebbe molto?
  • Re: Verifica continua della connessione

    anonimo ha scritto:


    Servirebbe per avvertire l'utente in tempo reale che è stata persa la connessione.
    Molte applicazioni hanno questa funzione, consumerebbe molto?
    No, direi che nessuna applicazione ha questa funzione implementata al suo interno: al massimo si basa su notifiche provenienti dal sistema operativo (es. il browser ha una API JavaScript specifica) per determinare se la connessione è disponibile, oppure nel momento in cui occorre inviare/ricevere dati viene gestito l'errore dovuto a connettività assente.

    Monitorare la connessione costantemente per determinare se, a un certo punto, è possibile scambiare dati non ha senso: si potrebbe rilevare che la connessione è presente, e poi magari questa cade subito dopo nel momento in cui si inizia il colloquio con qualcosa di esterno.

    A maggior ragione, ha ancora meno senso notificare questa condizione all'utente quando cambia lo stato della connessione: soprattutto con la rete mobile (ma anche col Wi-fi a volte) questo avviene più che di frequente nell'arco di una giornata: la connessione ai dati non va mai considerata come una risorsa stabile a disposizione, perché va e viene di continuo, anche se non ce ne accorgiamo.

    Questi scenari sono alla base delle motivazioni tali per cui non si sviluppano app che si collegano in modo permanente a risorse in rete locale (es. database) ma si sfruttano invece protocolli come HTTP in modalità REST, ovvero scambiando dati solo quando necessario e implementando caching e/o retry a fronte di errori nella specifica comunicazione.
  • Re: Verifica continua della connessione

    È un errore comune dei principianti. Gli errori di connessione si gestiscono anche perché la connessione può cadere in qualsiasi momento anche mentre è in corso uno scambio dati. In quel caso a che ti serve testarlo continuamente?
  • Re: Verifica continua della connessione

    Capito, allora la verificherò solo quando necessario.
    La mia idea era di collegarla ad un icona che diventava rossa nel caso in cui la connessione sarebbe andata persa, così da evitare che l'utente faccia inutili "prove" di click.
    Grazie.
  • Re: Verifica continua della connessione

    Supponi che l'icona mi dica che la connessione è attiva, apro il browser e in quel momento cade la connessione. A cosa è servito tutto questo?
  • Re: Verifica continua della connessione

    Il programma fa un'operazione ,che in presenza di connessione, esegue in meno di un secondo, non vedo il motivo per cui aprire il browser...
    Se l'icona è attiva, l'utente sa che c'è connessione e può eseguire quell'operazione senza visualizzare un messaggio di errore.
    Così, se l'icona non è attiva, l'utente non perde tempo a provare a fare l'operazione.

    Quindi arrivati a questo punto, mi sconsigliate di fare questa cosa per via dell'elevato consumo in background?
    Se si, peccato perché a parer mio sarebbe stata una funzione utile.
  • Re: Verifica continua della connessione

    Non ho idea di quanto sia costante una connessione ma forse consumeresti meno energia se invece di aggiungere un thread in background che segue la verifica in modo continuo utilizzassi un timer che ad ogni tot millisecondi esegue la verifica , ciao
  • Re: Verifica continua della connessione

    Ci avevo pensato, ma in quel caso andrei a richiamare la void di verificaConnessione continuamente, impedendomi di eseguire altri comandi. Per questo mi serviva un lavoro in background.
  • Re: Verifica continua della connessione

    "impedendomi di eseguire altri comandi" ,sei sicuro ? i cellulari sono multicore e multithread per ogni core ,non credo che il dispositivo rimarrebbe bloccato... ,prova a vedere quest'articolo https://www.html.it/articoli/multithreading-android-asynctack/, forse ti conviene approfondire un pò l'argomento ,importante è che non occupi il thread principale ,ciao
  • Re: Verifica continua della connessione

    anonimo ha scritto:


    Così, se l'icona non è attiva, l'utente non perde tempo a provare a fare l'operazione.
    Magari la connessione non è attiva, ma nel momento in cui lancio l'applicazione lo diventa.

    La connessione è sempre instabile, quindi verificarla in un momento diverso da quello in cui deve essere utilizzata, che sia anche una frazione di secondo, non ha alcun senso.
  • Re: Verifica continua della connessione

    Capito, grazie .
  • Re: Verifica continua della connessione

    Fai prima con reachability prima di inviare / ricevere qualsiasi cosa...
    public boolean AddressReachable(String hostUrl) {
            try {
                URL url = new URL(hostUrl);
                final HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
                urlc.setRequestProperty("User-Agent", "Android Application");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(10 * 1000);
                urlc.connect();
                if (urlc.getResponseCode() == 200) {
                    return true;
                }
            } catch (Throwable e) {
                e.printStackTrace();
            }
            return false;
        }
    qui in pratica fa una chiamata veloce all'indirizzo web che devi utilizzare ... se risponde entro 10 secondi è raggiungibile e quindi funzionante ... non serve nemmeno vedere se hai la connessione funzionante... se risponde vuole dire che funziona.
Devi accedere o registrarti per scrivere nel forum
13 risposte