Return to Video

(Optional) Networking - Part 1 (13:43)

  • 0:00 - 0:10
    [MUSICA]
  • 0:16 - 0:21
    Una delle caratteristiche distintive dei
    sistemi mobile moderni è che essi possono
  • 0:21 - 0:26
    tenerci collegati in rete senza tenerci
    legati a una singola locazione.
  • 0:28 - 0:31
    In questa lezione, esploreremo il
    software e
  • 0:31 - 0:36
    le pratiche di programmazione che servono per
    collegare le applicazioni alla rete.
  • 0:37 - 0:41
    Quindi inizierò questa lezione discutendo
    del networking in generale.
  • 0:41 - 0:46
    Tale discussione si concentrerà sul
    collegamento delle app a Internet
  • 0:46 - 0:50
    usando l'HyperText Transfer Protocol
  • 0:50 - 0:55
    o HTTP, precisamente tramite richieste HTTP GET.
  • 0:57 - 1:02
    Dopo di che, vi presenterò diverse classi
    che Android offre per supportare questo
  • 1:02 - 1:07
    tipo di networking e infine, discuterò di
    come le applicazioni possono
  • 1:07 - 1:13
    elaborare i dati ricevuti in risposta
    a queste richieste HTTP GET.
  • 1:13 - 1:18
    In particolare, parlerò di due popolari
    linguaggi di formattazione dei dati.
  • 1:18 - 1:21
    Uno, il JavaScript Object Notation Language,
  • 1:21 - 1:27
    o JSON e due, l'Extensible Markup Language,
    o XML.
  • 1:27 - 1:32
    E parlerò di come si analizzano,
    o si capiscono,
  • 1:32 - 1:37
    queste risposte HTTP quando sono
    formattate in uno di questi linguaggi.
  • 1:37 - 1:41
    Dunque, i primi dispositivi palmari
    ci hanno dato la mobilità.
  • 1:41 - 1:46
    Ci si poteva spostare da un luogo all'altro,
    ed eseguire comunque computazioni utili.
  • 1:47 - 1:53
    Tuttavia, le loro capacità di networking
    erano primitive per gli standard odierni.
  • 1:53 - 1:58
    Ora, andando avanti, i dispositivi di oggi
    combinano potenti processori con
  • 1:58 - 2:03
    veloci connessioni di rete via WiFi
    e reti cellulari.
  • 2:04 - 2:08
    Le applicazioni portatili quindi vorranno
    spesso far uso
  • 2:08 - 2:14
    di queste funzionalità di rete per
    accedere a dati e servizi e fornirne.
  • 2:16 - 2:22
    Per aiutarvi a farlo, Android include una
    varietà di classi di supporto al netwoking
  • 2:22 - 2:27
    tra cui le classi Socket e URL,
    nei package java.net,
  • 2:28 - 2:37
    le classi HttpRequest e HttpResponse,
    nei package org.apache.
  • 2:37 - 2:45
    E le classi URI, AndroidHttpClient, e AudioStream, nei package android.net.
  • 2:46 - 2:51
    In questa lezione guarderemo
    molte di queste classi,
  • 2:51 - 2:55
    usando ciascuna di esse per implementare
    la stessa applicazione di esempio.
  • 2:56 - 3:01
    Quest'applicazione interagisce con un
    servizio internet per ottenere informazioni
  • 3:01 - 3:05
    sui terremoti che si sono verificati in
    una particolare regione geografica.
  • 3:05 - 3:11
    E come vedrete, quei dati vengono
    restituiti in vari formati.
  • 3:11 - 3:16
    Inizialmente ci limiteremo a visualizzare
    il testo così come viene scaricato.
  • 3:16 - 3:19
    Più avanti nella lezione,
    vi mostrerò come processare
  • 3:19 - 3:24
    quei dati per estrarre solo le
    informazioni che volete.
  • 3:24 - 3:26
    Oh, e un'altra cosa.
  • 3:26 - 3:31
    Come si vedrà tra un momento, poiché questi
    dati includono informazioni geografiche,
  • 3:31 - 3:36
    sarebbero più adatti ad essere mostrati
    su una mappa, piuttosto che come testo.
  • 3:36 - 3:39
    Ora, non lo faremo in questa lezione,
    ma ricordatelo,
  • 3:39 - 3:44
    perché ci ritorneremo quando arriveremo
    alla lezione su mappe e posizione.
  • 3:46 - 3:52
    Per far funzionare quest'applicazione,
    il codice deve creare una richiesta http,
  • 3:52 - 3:58
    inviarla a un server, recuperare i
    risultati, e quindi visualizzarli.
  • 3:59 - 4:02
    Android fornisce molte classi
    per aiutare con questo.
  • 4:03 - 4:07
    Tre di cui parleremo ora sono
    la classe Socket,
  • 4:09 - 4:14
    la classe HttpUrlConnection
    e la classe AndroidHttpClient.
  • 4:14 - 4:24
    Ora lancerò l'applicazione
    NetworkingSockets.
  • 4:25 - 4:27
    Come potete vedere,
  • 4:27 - 4:32
    quest'applicazione all'inizio visualizza un solo
    pulsante etichettato "Load Data" (Carica i Dati).
  • 4:33 - 4:39
    Quando premo il pulsante, l'applicazione
    emette una richiesta HTTP GET
  • 4:39 - 4:46
    a un server esterno, e quel server
    risponderà con del complesso
  • 4:46 - 4:48
    che contiene i dati
    dei terremoti richiesti.
  • 4:49 - 4:53
    Ok, quindi ora premo
    il pulsante "Load Data"
  • 4:54 - 4:57
    e si possono vedere i dati richiesti.
  • 4:59 - 5:03
    Diamo un'occhiata al codice sorgente per
    vedere cosa fa per ottenere i dati.
  • 5:03 - 5:06
    Ora qui ho aperto l'applicazione
    nell'IDE.
  • 5:09 - 5:10
    Ora aprirò l'Activity principale di
  • 5:10 - 5:17
    questa applicazione, e qui sto mostrando
    il listener del tasto "Load Data".
  • 5:19 - 5:23
    Quando si preme questo pulsante,
    l'applicazione crea, e
  • 5:23 - 5:28
    quindi esegue, un AsyncTask
    chiamato HttpGetTask.
  • 5:29 - 5:30
    Diamo un'occhiata a quella classe.
  • 5:32 - 5:37
    La classe HttpGetTask dichiara
    in primo luogo alcune variabili, che
  • 5:37 - 5:41
    vengono utilizzate nella creazione
    di una richiesta HTTP GET.
  • 5:43 - 5:49
    Quando viene chiamato il metodo execute, sul HttpGetTask,
  • 5:49 - 5:50
    viene chiamato il metodo
    doInBackground.
  • 5:52 - 5:57
    E questo metodo inizia con la creazione
    di un nuovo Socket,che verrà connesso
  • 5:57 - 6:07
    al computer host, api.geonames.org
    sulla porta HTTP standard, porta 80.
  • 6:07 - 6:12
    Successivamente, il codice ottiene
    l'OutputStream del Socket,
  • 6:12 - 6:18
    e quindi scrive l'HTTPGETCOMMAND, e questa
    stringa sarà inviata al computer host,
  • 6:19 - 6:23
    che la interpreta come una HTTPGetRequest,
  • 6:23 - 6:29
    e quindi risponde inviando
    i dati di risposta appropriati.
  • 6:29 - 6:34
    Quindi questo codice continua ottenendo
    l'InputStream del Socket e
  • 6:34 - 6:37
    passandolo a un metodo
    chiamato readStream.
  • 6:39 - 6:44
    Il metodo readStream infine legge i dati
    di risposta dall'InputStream del Socket.
  • 6:44 - 6:49
    e quindi restituisce la risposta
    come una singola stringa.
  • 6:49 - 6:56
    E questa stringa viene passata
    al metodo onPostExecute che
  • 6:56 - 7:02
    viene eseguito sul thread principale e
    che visualizza la risposta nella TextView.
  • 7:03 - 7:05
    Torniamo all'applicazione.
  • 7:05 - 7:10
    Si noterà che il testo di risposta include
    non solo i dati dei terremoti, ma
  • 7:10 - 7:14
    anche gli header della risposta HTTP.
  • 7:14 - 7:18
    Ora, di norma, non vorrei
    mostrare questo testo qui.
  • 7:18 - 7:21
    Voglio solamente mostrare i dati dei terremoti.
  • 7:21 - 7:25
    Quindi avrei dovuto
    analizzare la risposta ed
  • 7:25 - 7:27
    estrarre solo i dati che volevo.
  • 7:29 - 7:32
    Inoltre, potreste aver notato
    che non ho scritto alcun
  • 7:32 - 7:36
    codice per la gestione di errori necessario
    per rendere quest'applicazione robusta.
  • 7:38 - 7:42
    E questi punti catturano abbastanza bene gli
    svantaggi nell'usare i Socket.
  • 7:42 - 7:44
    Il livello è molto basso,
  • 7:44 - 7:47
    puoi scrivere qualsiasi cosa
    tu voglia sul socket,
  • 7:47 - 7:54
    ma in cambio hai bisogno di gestire
    tutti i dettagli del fare le richieste HTTP,
  • 7:54 - 7:59
    tutta la gestione degli errori, e tutto
    il processing delle risposte HTTP.
  • 8:02 - 8:09
    La prossima implementazione che vedremo usa la classe HttpUrlConnection.
  • 8:09 - 8:13
    Questa classe fornisce un'interfaccia
    di più alto livello, che gestisce più
  • 8:13 - 8:19
    dettagli del networking rispetto alla
    classe Socket, ma come vedremo tra breve,
  • 8:19 - 8:24
    ha anche una API meno flessibile
    della nostra ultima opzione,
  • 8:24 - 8:27
    la classe AndroidHttpClient.
  • 8:29 - 8:33
    Detto questo, voglio anche sottolineare
    che il team Android non sta più
  • 8:33 - 8:37
    lavorando attivamente
    sulla classe AndroidHttpClient, e
  • 8:37 - 8:42
    si sta concentrando sul miglioramento
    della classe che vedremo ora.
  • 8:42 - 8:47
    Quindi guardiamo l'applicazione
    di esempio, implementata questa volta
  • 8:47 - 8:51
    con la classe HttpUrlConnection.
  • 8:53 - 8:57
    Ora lancio l'applicazione NetworkingURL.
  • 8:57 - 9:02
    Come prima, quest'applicazione mostra
    inizialmente un singolo pulsante
  • 9:02 - 9:07
    un singolo pulsante etichettato "Load Data"
    e come prima, quando premo quel pulsante
  • 9:07 - 9:12
    l'applicazione emette
    una richiesta HTTP GET
  • 9:12 - 9:13
    a un server esterno,
  • 9:13 - 9:17
    e tale server risponderà
    con del testo complesso,
  • 9:17 - 9:21
    contenente i dati richiesti sui terremoti.
  • 9:21 - 9:21
    Ok,
  • 9:21 - 9:23
    quindi ora premo
    il pulsante "Load Data".
  • 9:25 - 9:29
    Si possono vedere i dati richiesti
    apparire in una TextView.
  • 9:30 - 9:35
    Si noti, tuttavia, che stavolta gli header
    della risposta HTTP sono stati rimossi.
  • 9:37 - 9:39
    Diamo un'occhiata al codice sorgente
    e vediamo come funziona.
  • 9:41 - 9:44
    Ora, qui ho l'applicazione
    aperta nell'IDE.
  • 9:45 - 9:47
    Ora apro la MainActivity di
  • 9:47 - 9:53
    di quest'applicazione, e qui mostro
    il listener del pulsante "Load Data".
  • 9:55 - 9:59
    Come prima, quando si preme questo tasto,
    l'applicazione crea e
  • 9:59 - 10:03
    quindi esegue un AsyncTask
    chiamato HttpGetTask.
  • 10:05 - 10:07
    Guardiamo quella classe.
  • 10:09 - 10:12
    Quando il metodo execute viene
    chiamato su HttpGetTask,
  • 10:12 - 10:15
    viene invocato il metodo doInBackground.
  • 10:15 - 10:20
    Tale metodo inizia creando
    un nuovo oggetto URL e
  • 10:20 - 10:25
    passando una stringa URL per il servizio
    desiderato come parametro.
  • 10:27 - 10:32
    Il codice chiama quindi il metodo
    openConnection sull'oggetto URL,
  • 10:32 - 10:36
    che restituisce una HttpUrlConnection.
  • 10:36 - 10:41
    Quest'oggetto viene poi memorizzato in una
    variabile chiamata httpURLConnection.
  • 10:41 - 10:47
    Il codice prosegue
    ottenendo l'InputStream
  • 10:47 - 10:51
    della HttpUrlConnection
    e passandola al metodo readStream.
  • 10:53 - 10:57
    E come prima, il metodo readStream
    legge i dati di risposta dal flusso
  • 10:57 - 11:02
    di input del Socket, poi restituisce
    la risposta come una singola stringa.
  • 11:03 - 11:09
    Questa volta, però, la HttpUrlConnection
    rimuove gli header
  • 11:09 - 11:14
    della risposta HTTP e gestisce
    il controllo degli errori per te.
  • 11:15 - 11:20
    Ora questa stringa viene quindi passata
    al metodo onPostExecute,
  • 11:20 - 11:22
    che mostra la risposta in una TextView.
  • 11:25 - 11:28
    La terza classe è AndroidHttpClient.
  • 11:29 - 11:35
    Questa classe è un'implementazione del
    DefaultHttpClient del progetto Apache
  • 11:36 - 11:39
    e permette una grande personalizzazione.
  • 11:39 - 11:45
    In particolare, la classe divide
    la transazione HTTP in un
  • 11:45 - 11:49
    oggetto richiesta
    e in un oggetto risposta.
  • 11:49 - 11:54
    Quindi si possono creare sottoclassi che
    personalizzano la gestione delle richieste
  • 11:54 - 11:56
    e delle loro risposte.
  • 11:56 - 11:59
    Ora conoscete già l'aspetto
    dell'applicazione, quindi
  • 11:59 - 12:03
    quindi saltiamo direttamente al codice ed
    esaminiamo l'implementazione.
  • 12:05 - 12:10
    Ora, qui ho aperto l'applicazione
  • 12:10 - 12:11
    NetworkingAndroidHttpClient nell'IDE.
  • 12:13 - 12:18
    Ora apro la MainActivity di questa
    applicazione, e andiamo direttamente
  • 12:18 - 12:25
    alla classe HttpGetTask.
    Tale classe inizia creando un nuovo
  • 12:25 - 12:31
    oggetto AndroidHttpClient, chiamando
    il metodo newInstance della classe.
  • 12:33 - 12:38
    Quando viene chiamato il metodo
    doInBackground, il codice crea
  • 12:38 - 12:43
    un oggetto HttpGet, passando la
    stringa URL per quella richiesta.
  • 12:44 - 12:47
    Quindi, crea un oggetto ResponseHandler.
  • 12:47 - 12:51
    Quest'oggetto è responsabile
    della gestione della risposta
  • 12:51 - 12:58
    alla richiesta HttpGet: in questo caso,
    il ResponseHandler è del tipo
  • 12:58 - 13:03
    BasicResponseHandler, che restituirà il
    corpo della risposta.
  • 13:03 - 13:08
    Vedremo un ResponseHandler più complesso
    più avanti in questa lezione.
  • 13:09 - 13:16
    E, infine, la richiesta e il ResponseHandler
    vengono passati al metodo execute,
  • 13:16 - 13:21
    che invia la richiesta e ottiene
    la risposta, passandola attraverso il
  • 13:21 - 13:29
    ResponseHandler, e il risultato di tutto
    questo viene poi passato ad onPostExecute,
  • 13:29 - 13:31
    che mostra la risposta in un campo di testo.
Title:
(Optional) Networking - Part 1 (13:43)
Description:

From Professor Adam Porter's "Programming Mobile Applications for Android Handheld Systems" course. See https://www.coursera.org/course/android

more » « less
Video Language:
English
Claude Almansi edited Italian subtitles for https:/.../index.mp4
Claude Almansi edited Italian subtitles for https:/.../index.mp4
Claude Almansi edited Italian subtitles for https:/.../index.mp4
Claude Almansi edited Italian subtitles for https:/.../index.mp4

Italian subtitles

Revisions