Autore Topic: controllo connessione dati...  (Letto 1347 volte)

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
controllo connessione dati...
« il: 23 Novembre 2010, 16:59:15 CET »
0
Ciao a tutti, ho un programma che si basa prevalentemente sull'uso della rete mobile. Principalmente svolge queste 3 operazioni utilizzando la rete:
  • All'apertura scarica da Internet una lista di punti d'interesse
  • Avvia Google Navi
  • In prossimità di un punto d'interesse apre il browser

Ora, vorrei gestire l'eventuale assenza di SIM, piuttosto che assenza di segnale, piuttosto che disabilitazione della connessione dati, in questo modo:
  • fare un controllo della presenza di connessione dati all'avvio del programma
  • try-catch del fetch della lista di POI
  • eventuali suggerimenti su come assicurarmi di non avere problemi con Navi e browser...

per il primo punto ho pensato ad una cosa del genere:
Codice (Java): [Seleziona]
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        if(!cm.getActiveNetworkInfo().isConnected()){
                if(D)Log.e(TAG, "Network Data Connection disabled");
                Toast.makeText(this, "Mobile Data Connection not enabled", Toast.LENGTH_LONG);
                finish();
        }
ditemi se ha senso e se si può utilizzare prima di compiere ogni azione "critica"...grazie a tutti

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:controllo connessione dati...
« Risposta #1 il: 23 Novembre 2010, 17:03:20 CET »
0
Ma non fai prima ad esempio a gestire il fallimento durante il recupero dei dati che ti servono senza preoccuparti di verificare a priori se c'è o meno connessione?

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:controllo connessione dati...
« Risposta #2 il: 23 Novembre 2010, 17:55:38 CET »
0
E' esattamente il tipo di consiglio che chiedevo! Il fatto è che il recupero dati non è l'unica operazione che utilizza la rete e in generale queste tre azioni avvengono in tempi diversi, per cui vorrei essere certo che nel momento in cui compio un'azione ci sia la rete. Per assurdo l'utente potrebbe accendere il programma, scaricare la lista, levare la SIM e pretendere di vedere il contenuto web. Io lo vorrei avvisare con un Toast: "niente contenuto finché non inserisci la SIM".

Ad ogni modo il metodo che uso per fare download della mia lista di punti d'interesse è questo:
Codice (Java): [Seleziona]
/**
         * Retrieves from the Internet a file at provided URL and saves it
         * in the smartphone at given path
         * @param uri the URL to look for the file
         * @param savePath the complete path, with filename, to wich save the file
         */

        private void fetchPoiList(String uri, String savePath){
                try {
                        URL url = new URL(uri); //you can write here any link
                        File file = new File(savePath);

                        long startTime = System.currentTimeMillis();
                        Log.e(TAG, "download begining");
                        Log.e(TAG, "download url:" + url);
                        Log.e(TAG, "downloaded file name:" + savePath);
                        /* Open a connection to that URL. */
                        URLConnection ucon = url.openConnection();

                        //Define InputStreams to read from the URLConnection.
                        InputStream is = ucon.getInputStream();
                        BufferedInputStream bis = new BufferedInputStream(is);

                        //Read bytes to the Buffer until there is nothing more to read(-1).
                        ByteArrayBuffer baf = new ByteArrayBuffer(50);
                        int current = 0;
                        while ((current = bis.read()) != -1) {
                                baf.append((byte) current);
                        }

                        /* Convert the Bytes read to a String. */
                        FileOutputStream fos = new FileOutputStream(file);
                        fos.write(baf.toByteArray());
                        fos.close();
                        Log.e(TAG, "download ready in"
                                        + ((System.currentTimeMillis() - startTime) / 1000)
                                        + " sec");

                } catch (IOException e) {
                        Log.e("ImageManager", "Error: " + e);
                }
        }

sapresti aiutarmi su dove inserire try/catch ecc e come gestirli...? grazie millemila...
« Ultima modifica: 23 Novembre 2010, 18:02:30 CET da ScarfaceIII »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:controllo connessione dati...
« Risposta #3 il: 23 Novembre 2010, 18:07:30 CET »
0
Per intercettare eventuali fallimenti della rete dovrebbe bastare mettere questo tra un try/catch

Codice (Java): [Seleziona]
                        URLConnection ucon = url.openConnection();

                        //Define InputStreams to read from the URLConnection.
                        InputStream is = ucon.getInputStream();
                        BufferedInputStream bis = new BufferedInputStream(is);

                        //Read bytes to the Buffer until there is nothing more to read(-1).
                        ByteArrayBuffer baf = new ByteArrayBuffer(50);
                        int current = 0;
                        while ((current = bis.read()) != -1) {
                                baf.append((byte) current);
                        }

Anche le istruzioni sotto probabilmente potrebbero tirare una IOException ma sarebbero relativi alla scrittura del file e non alla lettura dal socket.

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:controllo connessione dati...
« Risposta #4 il: 23 Novembre 2010, 21:21:58 CET »
0
Grazie mille della pronta risposta. Volevo chiedere: ma essendo tutto il metodo racchiuso in un "try/catch" non è tutto "già fatto"? o devo fare un try/catch dentro un try/catch?
E, perdona la stupidità delle domande, ma non ho dimestichezza con questo strumento, nel "catch" posso fare Toast, chiamare metodi et simila? Mi spiego: quello che vorrei fare è avvisare l'utente che deve connettersi ad una rete per non far chiudere l'applicazione, e lo vorrei fare con un Toast:
Codice (Java): [Seleziona]
try{
                                baf = new ByteArrayBuffer(50);
                                /* Open a connection to that URL. */
                                ucon = url.openConnection();
                                //Define InputStreams to read from the URLConnection.
                                InputStream is = ucon.getInputStream();
                                BufferedInputStream bis = new BufferedInputStream(is);

                                //Read bytes to the Buffer until there is nothing more to read(-1).
                                int current = 0;
                                while ((current = bis.read()) != -1) {
                                        baf.append((byte) current);
                                }

                        }
                        catch(IOException e){
                                Log.e(TAG, "Impossible to establish a connection, no PoiList downloaded");
                                Toast.makeText(getApplicationContext(), "Mobile Data Connection not available", Toast.LENGTH_LONG);
                        }
Il Log viene effettuato, ma non il Toast...perché?
Edit: risolto da solo...Ultima, lo prometto: che genere di Exception devo mettere nel catch della connessione? come faccio a sapere quale devo mettere?

grazie ancora
« Ultima modifica: 24 Novembre 2010, 11:33:12 CET da ScarfaceIII »