Autore Topic: Http Get  (Letto 2190 volte)

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Http Get
« il: 08 Novembre 2010, 21:54:20 CET »
0
Ho necessità di effettuare connessioni Http GET nella mia applicazione. Ho provato ad utilizzare sia un HttpUrlConnection, sia un HttpClient ma ho il problema che si freeza l'applicazione quando il server web rallenta la risposta. La connessione la effettuo dentro un AsyncTask.

Faccio un esempio di codice:
Codice (Java): [Seleziona]
                        URL url=null;

                        myApp=MyApplication.getInstance();

                        BufferedReader rd=null;

                        Boolean b=false;

                        String urlString="http://www.sito.it";

                        HttpURLConnection urlConnection=null;

                        HttpURLConnection socket=null;

                        url = new URL(urlString);

                               urlConnection = (HttpURLConnection)url.openConnection();
                                urlConnection.setDoInput(true);
                                urlConnection.setRequestMethod("GET");
                                urlConnection.setAllowUserInteraction(false);        
                                urlConnection.setDoOutput(true);
                                urlConnection.setReadTimeout(5000);
                                urlConnection.setConnectTimeout(5000);
                               
                                try{

                                        rd = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()),8*1024);

                                }catch(Exception e){Log.e("MOTIVO", e.toString());}
                                String line = "";

                                while ((line = rd.readLine()) != null) {
                                        Log.e(" Line=",line);
                                      }

poi faccio delle operazione per fare il parsing della linea di risposta ed altre operazioni. Ripeto che il tutto lo faccio all'interno di un AsyncTask

Guardando altre applicazioni non noto quei rallentamenti che invece ci sono nella mia. Ho impostato anche il timeout per la connessione, ma questo può causare qualche problema: se imposto un tempo di timeout troppo breve il server potrebbe non fare in tempo a rispondere, se imposto un tempo di timeout troppo lungo è come se non fosse impostato perchè l'app freeza.

Avete qualche esperienza in merito?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #1 il: 09 Novembre 2010, 15:15:31 CET »
0
Sicuro di usare bene l'AsyncTask? Il codice che hai postato dove l'hai inserito?

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #2 il: 09 Novembre 2010, 15:19:41 CET »
0
Sicuro di usare bene l'AsyncTask? Il codice che hai postato dove l'hai inserito?

ho creato una funziona apposita dentro l'asynctask quindi potrei invocarla con new BackGroundWorker.connetti();

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #3 il: 09 Novembre 2010, 15:21:31 CET »
0
Ehm... no!

Mi sa che ti conviene dare una lettura qui: AsyncTask | Android Developers

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #4 il: 09 Novembre 2010, 15:22:44 CET »
0
Ehm... no!

Mi sa che ti conviene dare una lettura qui: AsyncTask | Android Developers

guarda l'ho inserità li perchè anche dentro doInBackground o in pubblishProgress non cambiavano le prestazioni (cosa che avevo fatto all'inizio)

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #5 il: 09 Novembre 2010, 15:25:33 CET »
0
Solo per curiosità, doInBackground lo chiamavi in questo modo: new BackGroundWorker.doInBackground();?

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #6 il: 09 Novembre 2010, 15:26:23 CET »
0
Solo per curiosità, doInBackground lo chiamavi in questo modo: new BackGroundWorker.doInBackground();?

no. lo chiamavo con new BackGroundWorker.execute();

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #7 il: 09 Novembre 2010, 15:27:36 CET »
0
Perfetto.

Allora torna a quella versione che sicuramente è il modo corretto di usare l'AsyncTask e se ti da ancora problemi posta il codice.

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #8 il: 09 Novembre 2010, 15:32:58 CET »
0
Perfetto.

Allora torna a quella versione che sicuramente è il modo corretto di usare l'AsyncTask e se ti da ancora problemi posta il codice.

alla fine ero passato a creare una versione a parte perchè non cambiava molto in termini di prestazioni...non so perchè.

visto che ci siamo ti chiedo una info :)

se io ho necessità di eseguire diverse funzioni (magari anche in contemporanea) se faccio:
Codice (Java): [Seleziona]
Backgrounworker bw=new Backgroundworker();
bw.execute(1);
bw.execute(2);

mi va in crash l'applicazione perchè dice che il thread è già in esecuzione (o è stato eseguito - non ricordo :P )
devo per forza fare new Backgroundworker.execute() etc..
il problema mi sorge se devo ripulire all'uscita dell'applicazione.

se definisco un oggetto bw poi mi basta fare bw.cancel , se ne creo uno nuovo ogni volta non posso tenerne traccia e quindi cancellarlo. mi dai un consiglio? ;)

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #9 il: 09 Novembre 2010, 15:38:57 CET »
0
Ehm... sicuro di aver letto il link?

Citazione
Threading rules
[...]
The task can be executed only once (an exception will be thrown if a second execution is attempted.)

Tornando al problema delle prestazioni. Se le chiamate le fai nel posto giusto nell'AsyncTask non dovresti avere alcun problema. Dal codice che hai postato, ovviamente, non possiamo capire se lo stai usando bene o meno!

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #10 il: 09 Novembre 2010, 16:05:05 CET »
0
Ti faccio un esempio di come lo utilizzo. Io lo invoco con new BackgroundWorker.execute(1);
Invoco la funzione connetti() all'interno del publishProgress perchè dentro doInBackground non è possibile creare nuovi handler dentro un thread
Codice (Java): [Seleziona]
@Override
                protected Void doInBackground ( Integer... params ) {

               

                        switch(params[0]){

                        case 1: publishProgress(1);break;

                        }

                        return null;

                }

                @SuppressWarnings("unchecked")
                @Override
                protected void onProgressUpdate ( Integer... values ) {

               

                        switch(values[0]){

                                case 1: try {
                                        connetti();
                                } catch (MalformedURLException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }break;


                        }

                        super.onProgressUpdate(values);
                }

Edit. posso chiamarlo anche dentro il DoInBackground basta che invoco Looper.prepare().
« Ultima modifica: 09 Novembre 2010, 16:08:58 CET da zerocool87 »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #11 il: 09 Novembre 2010, 16:20:43 CET »
0
Non vorrei essere petulante... ma hai letto il link?

Mi rispondo da solo: NO!

Questo perché se l'avessi letto avresti anche fatto caso al fatto che l'unico metodo dell'AsyncTask che sta fuori dal thread UI è proprio doInBackground.

Se effettui la connessione in onProgressUpdate, non fai altro che effettuarla nel thread UI, quindi è ovvio che ti freeza tutto.

La connessione *deve* essere fatta all'interno del metodo doInBackground e ovviamente senza il Looper.prepare() (altrimenti torni ancora una volta nel thread UI). Il risultato della connessione te lo ritrovi all'interno di onPostExecute.

Se hai necessità di fare più cose in parallelo dentro doInBackground (ovvero creare nuovi handler), il singolo AsyncTask non può essere utilizzato. Per ovviare il problema o usi più AsyncTask o crei manualmente tu gli handler senza usare l'AsyncTask.

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #12 il: 09 Novembre 2010, 16:22:52 CET »
0
Non vorrei essere petulante... ma hai letto il link?

Mi rispondo da solo: NO!

Questo perché se l'avessi letto avresti anche fatto caso al fatto che l'unico metodo dell'AsyncTask che sta fuori dal thread UI è proprio doInBackground.

Se effettui la connessione in onProgressUpdate, non fai altro che effettuarla nel thread UI, quindi è ovvio che ti freeza tutto.

La connessione *deve* essere fatta all'interno del metodo doInBackground e ovviamente senza il Looper.prepare() (altrimenti torni ancora una volta nel thread UI). Il risultato della connessione te lo ritrovi all'interno di onPostExecute.

Se hai necessità di fare più cose in parallelo dentro doInBackground (ovvero creare nuovi handler), il singolo AsyncTask non può essere utilizzato. Per ovviare il problema o usi più AsyncTask o crei manualmente tu gli handler senza usare l'AsyncTask.


ho provato ad effettuare la connessione dentro doInBackground, ma come ti dicevo senza dare Looper.prepare() l'applicazion crasha...

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Http Get
« Risposta #13 il: 09 Novembre 2010, 16:24:57 CET »
0
Con quale errore?

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Http Get
« Risposta #14 il: 09 Novembre 2010, 16:25:54 CET »
0
Con quale errore?


che è necessario chiamare prima Looper.prepare();