Autore Topic: chiamata http che possa essere interrotta  (Letto 1863 volte)

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
chiamata http che possa essere interrotta
« il: 25 Dicembre 2010, 17:57:31 CET »
0
ciao a tutti.

Vi pongo un piccolo problema che credo richieda una conoscenza un po' approfondita dei thread in Java.
Quello che vorrei fare nella mia applicazione è una connessione http che possa essere interrotta.
Entrando un po' più nel dettaglio:
- in un thread secondario effettuo la connessione e il recupero dei dati.
- nel thread principale vorrei poter lanciare in qualunque momento thread.interrupt() sull'altro thread per interromperlo, ignorando totalmente lo stato in cui si trova il colloquio http (e lasciando che venga chiusa la connessione TCP col server web). Nel thread secondario vorrei comunque intercettare InterruptedException per una uscita pulita.

Per effettuare la connessione http ho provato due modi differenti: uno che usa le classi org.apache.http.* e l'altro che usa java.net.* . Con entrambi thread.interrupt() non ha alcun effetto.

C'è un modo per ottenere questo?

P.S.: domanda nella domanda: quale è preferibile tra org.apache.http.* e java.net.* e perchè?

grazie mille.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:chiamata http che possa essere interrotta
« Risposta #1 il: 25 Dicembre 2010, 21:56:14 CET »
0
Potresti provare a gestire le chiamate tramite un AsyncTask. Dispone di un metodo cancel per interromperlo...

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #2 il: 26 Dicembre 2010, 11:18:57 CET »
0
proverò senz'altro. Grazie del suggerimento.

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #3 il: 26 Dicembre 2010, 13:41:03 CET »
0
Ho provato con AsynkTask, ma niente da fare.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:chiamata http che possa essere interrotta
« Risposta #4 il: 26 Dicembre 2010, 13:42:32 CET »
0
Prova a postare un po' di codice ;)

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #5 il: 27 Dicembre 2010, 21:32:55 CET »
0
Ecco un po' di codice, eseguito dentro un AsyncTask:
Codice (Java): [Seleziona]
    private String do_connection(String url) {

        HttpResponse response;
        String result = null;

        try {

            HttpClient client = new DefaultHttpClient();
            HttpPost request = new HttpPost(url);
            // set this to avoid 417 error (Expectation Failed)
            request.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);

            // dati per il POST
            List<NameValuePair> name_value = new ArrayList<NameValuePair>();
            name_value.add(new BasicNameValuePair("sid", "abcde"));
            request.setEntity(new UrlEncodedFormEntity(name_value));

            Log.d(this.toString(), "connecting...");
            response = client.execute(request);
            Log.d(this.toString(), "status: " + response.getStatusLine().toString());
            HttpEntity entity = response.getEntity();

            InputStream instream = entity.getContent();
            result = convert_stream_to_string(instream);
            Log.i(this.toString(), "RESULT: " + result);

        } catch (ClientProtocolException e) {
            Log.e(this.toString(), "ClientProtocolException");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e(this.toString(), "IOException");
            e.printStackTrace();
        }

        return result;

    }
introducendo volutamente un lungo ritardo nella risposta lato server, si vede chiaramente che il thread si ferma dopo aver stampato a log "Connecting..." e, se dall'interfaccia eseguo .cancel(true) sull'AsyncTask, esso rimane lì dov'è e al completamento della risposta dal parte del server continua come se niente fosse. L'esecuzione del metodo .cancel(true) ritorna true; documentazione alla mano, confermerebbe la buona riuscita della richista di termine esecuzione.
Idee?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:chiamata http che possa essere interrotta
« Risposta #6 il: 28 Dicembre 2010, 10:43:06 CET »
0
Non sono sicuro che cancel(true) cancelli l'esecuzione del task.
Credo, piuttosto, che provi a cancellarne l'esecuzione.

7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #7 il: 28 Dicembre 2010, 11:01:08 CET »
0
Beh sì, alla luce dei fatti dev'essere come dici tu. Ed è anche vero che interrompere thread è da sempre una questione spinosa, non solo in Java.
Però poter 'sbloccare' un thread che è semplicemente in attesa di ricevere dati dalla rete in alcuni casi potrebbe diventare una esigenza importante. Un modo magari c'è...

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:chiamata http che possa essere interrotta
« Risposta #8 il: 28 Dicembre 2010, 11:17:32 CET »
0
Beh sì, alla luce dei fatti dev'essere come dici tu. Ed è anche vero che interrompere thread è da sempre una questione spinosa, non solo in Java.
Però poter 'sbloccare' un thread che è semplicemente in attesa di ricevere dati dalla rete in alcuni casi potrebbe diventare una esigenza importante. Un modo magari c'è...
certo, puoi fargli lanciare un'eccezione, invece che chiamare cancel(true) chiami una funzione fatta da te, che cambia un parametro dentro al tuo thread (dovresti estendere la classe thread), se quel parametro cambia dentro al run viene lanciata un'eccezione (che fai te o usi una delle tante di java, ma te lo sconsiglio), la catturi e fai quello che devi fare :D
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #9 il: 28 Dicembre 2010, 11:28:22 CET »
0
Sì, ma è una soluzione parziale: l'eccezione non verrebbe sollevata fino a quanto non succede qualcosa sulla rete che fa terminare l'esecuzione di client.execute(request) . Se il server web impiegasse 2 minuti a rispondere il thread resterebbe lì 2 minuti comunque.
Forse dovrei fare la comunicazione web con qualcosa di diverso da org.apache.http, che supporti l'interruzione all'interno delle funzioni di rete.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:chiamata http che possa essere interrotta
« Risposta #10 il: 28 Dicembre 2010, 11:32:32 CET »
0
Beh sì, alla luce dei fatti dev'essere come dici tu.

L'ho detto solo per quello che c'è scritto sulla documentazione.

Posso dirti che io ho fatto un'applicazione che effettua una connessione con httpget e che viene interrotta.
L'unica differenza è che non uso un AsyncTask ma un thread, che interrompo con un interrupt.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #11 il: 28 Dicembre 2010, 16:20:36 CET »
0
Quella del Thread con HttpGet era la prova iniziale che avevo fatto. Ora riprovo facendo più attenzione.

Offline gigi

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Gentoo
Re:chiamata http che possa essere interrotta
« Risposta #12 il: 29 Dicembre 2010, 15:01:24 CET »
0
Ho ri-provato usando un Thread anzichè AsyncTask.
Codice (Java): [Seleziona]
        HttpClient client = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);
        Log.d(this.toString(), "connecting...");
        HttpResponse response = client.execute(httpget);
        Log.d(this.toString(), "status: " + response.getStatusLine().toString());
        HttpEntity entity = response.getEntity();

niente da fare... il Thread si ferma a client.execute(httpget), e l'esecuzione di .interrupt() su di esso dal thread principale non ha alcun effetto. Alla risposta del server web l'esecuzione continua come se niente fosse.

7h38ugg3r, cosa fai tu di diverso? puoi mostrarmi del codice?
grazie.

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:chiamata http che possa essere interrotta
« Risposta #13 il: 29 Dicembre 2010, 16:12:54 CET »
0
potresti implementarti il tuo metodo per fermare il thread   :

Codice (Java): [Seleziona]
----nella classe thread-----
boolean ferma=false;

public void femaThread(){
if(ferma) return;
ferma=true;
interrupt();
client.getConnectionManager().shutdown();    // ?? da testare ?? dovrebbe terminare le connessioni ?


}

public void run(){
....
...
..
HttpResponse response = client.execute(httpget);

if(isInterrupted())
break;

}

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:chiamata http che possa essere interrotta
« Risposta #14 il: 29 Dicembre 2010, 16:38:53 CET »
0

7h38ugg3r, cosa fai tu di diverso? puoi mostrarmi del codice?
grazie.

Il mio thread di fatto è un'activity.
Mostro un dialog e, se lo interrompo, invio l'interruzione al thread.

Codice (Java): [Seleziona]
...
dialog = ProgressDialog.show(this, "", ctx.getString(R.string.cerco), true, true,
     new DialogInterface.OnCancelListener() {

          public void onCancel(DialogInterface dialog) {
               if (findThread.isAlive()) {
                    findThread.interrupt();
               }
               Toast.makeText(ctx, ctx.getString(R.string.interrotto), Toast.LENGTH_SHORT).show();
          }
     }
);

niente più di quello che fai tu...
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/