Autore Topic: Progress Bar durante controllo network  (Letto 728 volte)

Offline grausof

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
Progress Bar durante controllo network
« il: 02 Agosto 2011, 11:23:17 CEST »
0
Salve a tutti, allora ho trovato su questo forum un pezzo di codice molto interessante che permette di controllare se è raggiungibile o meno un sito web. Io l'ho adattato alle mie esigenze:
Codice (Java): [Seleziona]
urlAuth="mioserver.it"
public boolean serverOK() throws MalformedURLException{

         
        try {
       
                        URL url = new URL(urlAuth);
                        URLConnection conn = url.openConnection();
                        conn.setConnectTimeout(9000);
                        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        Toast.makeText(this, "Il server è raggiungibile" , Toast.LENGTH_LONG).show();
                        return true;
                               
                } catch (MalformedURLException e) {
                        throw e;
                } catch (IOException e) {
                         Toast.makeText(this, "Il server non è raggiungibile" , Toast.LENGTH_LONG).show();
                     finish();  
                         return false;
                }
 }
Il codice funziona perfettamente, ma siccome impiega un po di tempo per interrogare il server ho deciso di inserire una progress Bar con:
Codice (Java): [Seleziona]
   pd=ProgressDialog.show(this,"","Connessione al server...");e poi la chiudo con  pd.dismiss();

Solo che quando parte il controllo (ossia all'avvio dell'applicazione) lo schermo resta tutto nero senza farmi visualizzare la progress Bar. Solo quando il controllo termina, mi viene restituito  il risultato e viene visualizzato tutto il layout dell'applicazione.

Ho anche provato a fare effettuare il controllo premendo un determinato bottone, ma succede la stessa cosa, come se l'applicazione si bloccasse per tutto il tempo del controllo. A cosa è dovuto?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Progress Bar durante controllo network
« Risposta #1 il: 02 Agosto 2011, 11:25:05 CEST »
0
E' dovuto al fatto che non usi propriamente il multithreading.
Guarda la classe AsyncTask ;)

Offline grausof

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
Re:Progress Bar durante controllo network
« Risposta #2 il: 02 Agosto 2011, 11:29:07 CEST »
0
Mhh... in un certo senso come dovrei fare.. Ho visto un po di tutorial ma non riesco a capire!  o_O

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:Progress Bar durante controllo network
« Risposta #3 il: 02 Agosto 2011, 12:15:49 CEST »
+1
l' AsyncTask è ottimo ma a volte utilizzo una mia classettina...

Codice (Java): [Seleziona]
package it.devandroid.example;

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class CheckConnection implements Runnable {

        Handler myHandler;
        boolean running = false;
        Thread thread;
        private Context myContext;
        private String site_to_check;

        public CheckConnection() {

        }

        public CheckConnection(Handler myHandler) {
                this.myHandler = myHandler;
                Log.i("debug", "this.myHandler: " + this.myHandler);
        }

        public void run() {
                // TODO Auto-generated method stub
                Boolean isconnection = isConnectivity();
                sendConnection(isconnection);

        }

        private void sendConnection(Boolean isconnection) {
                Message msg = myHandler.obtainMessage();
                Bundle b = new Bundle();
                b.putString("connection", isconnection ? "ok" : "ko");
                msg.setData(b);
                this.myHandler.sendMessage(msg);

        }

        public void check(Context context, String site) {
               
                myContext = context;
                site_to_check= site;
                start();

        }

        private void start() {
                if (!running) {
                        running = true;
                        thread = new Thread(this);
                        thread.start();
                }

        }

        public void stop() {
                if (running) {
                        running = false;
                        thread = null;
                }

        }

        // Controlla se c'è connessione ad internet in tot secondi
        private boolean isConnectivity() {
               
            // qui puoi personalizzare il comando
                URL url;       

                        try {
                                url = new URL(site_to_check);
                                HttpURLConnection httpConn = (HttpURLConnection) url
                                                .openConnection();
                                httpConn.setConnectTimeout(10000);
                                httpConn.connect();
                                Log.i("debug", "ok connesso: ");
                                return true;

                        } catch (MalformedURLException e) {
                                Log.i("debug", "MalformedURLException: ");
                                return false;

                        } catch (Exception e) {
                                Log.i("debug", "Exceptionerrore: " + e.getMessage());
                                return false;
                        }
               

        }

}

Codice (Java): [Seleziona]
package it.devandroid.example;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class CheckConnectionActivity extends Activity {
    private CheckConnection check;



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        checkConnection();
    }
   
   
    private void checkConnection() {
                // TODO Auto-generated method stub
        check= new CheckConnection(myHadler);
        check.check(this, "http://www.google.it");
               
        }


        final Handler myHadler = new Handler() {
                public void handleMessage(Message msg) {

                        String connessione = msg.getData().getString("connection");
                        Log.i("debug", "messaggio ricevuto: " + connessione);
                        check.stop();
                        if(connessione.equals("ko")){
                                showErrorConnection();
                        }else if(connessione.equals("ok")){
                                Log.i("debug", "connessione ok");
                       
                        }

                }

                private void showErrorConnection() {
                        // TODO Auto-generated method stub
                       
                }
        };
}

Ovviamente si può fare il mille modi
La domanda stupida è quella che non si fa

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Progress Bar durante controllo network
« Risposta #4 il: 02 Agosto 2011, 16:08:59 CEST »
0
Un altro modo potrebbe essere quello di eseguire il contenuto del tuo try-catch in un semplice Thread e chiudere la ProgressDialog dal thread stesso, in pratica verrebbe :

Codice (Java): [Seleziona]
public boolean serverOK() throws MalformedURLException{

        Thread checkThread = new Thread(){
        @Override
        public void run(){
                   try {
       
                        URL url = new URL(urlAuth);
                        URLConnection conn = url.openConnection();
                        conn.setConnectTimeout(9000);
                        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                        Toast.makeText(NomeDellaClasse.this, "Il server è raggiungibile" , Toast.LENGTH_LONG).show();
                        pd.dismiss()
                        return true;
                               
                   } catch (MalformedURLException e) {
                         pd.dismiss();
                         throw e;
                   } catch (IOException e) {
                        pd.dismiss();
                        Toast.makeText(NomeDellaClasse.this, "Il server non è raggiungibile" , Toast.LENGTH_LONG).show();
                        finish();  
                        return false;
                   }
        }};
       pd=ProgressDialog.show(this,"","Connessione al server...");
       checkThread.start();
     
      return true ; // sei obbligato a ritornare un valore booleano...
 }

A grandi linee...però poi dovrai rivederti il codice, perchè quei return true e return false nel Thread poco importano ora :-P Se hai bisogno di un valore di ritorno, dell'esito della connesione, dovrai implementare un custom listener oppure un Handler, in questo modo potrai chiudere la ProgressDialog nel finally una volta sola, invece che richiamarlo per tutti gli avvenimenti possibili...

Offline grausof

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
Re:Progress Bar durante controllo network
« Risposta #5 il: 03 Agosto 2011, 09:20:16 CEST »
0
Grazie per gli aiuti. Teskio ho provato come hai detto tu, ma il controllo non viene effettuato!  :-(

Offline gsources75

  • Utente normale
  • ***
  • Post: 327
  • Respect: +9
    • Google+
    • pepigno75
    • devandroid_it
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus S - Vodafone Smart -BB Bold- Iphone 4-
  • Play Store ID:
    Giuseppe+Sorce
  • Sistema operativo:
    Ubuntu-Windows Seven- Mac Lion
Re:Progress Bar durante controllo network
« Risposta #6 il: 03 Agosto 2011, 09:22:38 CEST »
0
Scusami ma la mia classe non ti ha dato qualche spunto. A me funziona perfettamente e poi è riutilizzabile.
La domanda stupida è quella che non si fa

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Progress Bar durante controllo network
« Risposta #7 il: 03 Agosto 2011, 09:28:54 CEST »
0
Ma perché l'AsyncTask no?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline grausof

  • Nuovo arrivato
  • *
  • Post: 38
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
Re:Progress Bar durante controllo network
« Risposta #8 il: 03 Agosto 2011, 09:40:05 CEST »
0
Finalmente ci sono riuscito. Grazie alla classe di gsources75, e qualche riga di codice presa da Teskio... Grazie mille a tutti.  :-)