0:00:00.013,0:00:10.013 [MUSICA] 0:00:15.594,0:00:20.836 Una delle caratteristiche distintive dei[br]sistemi mobile moderni è che essi possono 0:00:20.836,0:00:26.170 tenerci collegati in rete senza tenerci[br]legati a una singola locazione. 0:00:27.550,0:00:30.640 In questa lezione, esploreremo il[br]software e 0:00:30.640,0:00:35.840 le pratiche di programmazione che servono per[br]collegare le applicazioni alla rete. 0:00:37.230,0:00:41.370 Quindi inizierò questa lezione discutendo[br]del networking in generale. 0:00:41.370,0:00:46.080 Tale discussione si concentrerà sul[br]collegamento delle app a Internet 0:00:46.080,0:00:49.960 usando l'HyperText Transfer Protocol 0:00:49.960,0:00:55.420 o HTTP, precisamente tramite richieste HTTP GET. 0:00:56.940,0:01:02.040 Dopo di che, vi presenterò diverse classi [br]che Android offre per supportare questo 0:01:02.040,0:01:06.760 tipo di networking e infine, discuterò di [br]come le applicazioni possono 0:01:06.760,0:01:12.710 elaborare i dati ricevuti in risposta [br]a queste richieste HTTP GET. 0:01:12.710,0:01:17.590 In particolare, parlerò di due popolari[br]linguaggi di formattazione dei dati. 0:01:17.590,0:01:21.450 Uno, il JavaScript Object Notation Language, 0:01:21.450,0:01:27.150 o JSON e due, l'Extensible Markup Language,[br]o XML. 0:01:27.150,0:01:31.700 E parlerò di come si analizzano, [br]o si capiscono, 0:01:31.700,0:01:36.578 queste risposte HTTP quando sono [br]formattate in uno di questi linguaggi. 0:01:36.578,0:01:41.410 Dunque, i primi dispositivi palmari [br]ci hanno dato la mobilità. 0:01:41.410,0:01:46.250 Ci si poteva spostare da un luogo all'altro,[br]ed eseguire comunque computazioni utili. 0:01:47.270,0:01:52.840 Tuttavia, le loro capacità di networking [br]erano primitive per gli standard odierni. 0:01:52.840,0:01:57.820 Ora, andando avanti, i dispositivi di oggi[br]combinano potenti processori con 0:01:57.820,0:02:02.550 veloci connessioni di rete via WiFi[br]e reti cellulari. 0:02:03.670,0:02:08.275 Le applicazioni portatili quindi vorranno[br]spesso far uso 0:02:08.275,0:02:14.040 di queste funzionalità di rete per [br]accedere a dati e servizi e fornirne. 0:02:15.710,0:02:21.510 Per aiutarvi a farlo, Android include una [br]varietà di classi di supporto al netwoking 0:02:21.510,0:02:26.889 tra cui le classi Socket e URL, [br]nei package java.net, 0:02:28.020,0:02:36.750 le classi HttpRequest e HttpResponse, [br]nei package org.apache. 0:02:36.750,0:02:44.630 E le classi URI, AndroidHttpClient, e AudioStream, nei package android.net. 0:02:46.220,0:02:50.620 In questa lezione guarderemo[br]molte di queste classi, 0:02:50.620,0:02:54.700 usando ciascuna di esse per implementare[br]la stessa applicazione di esempio. 0:02:55.720,0:03:01.290 Quest'applicazione interagisce con un [br]servizio internet per ottenere informazioni 0:03:01.290,0:03:05.470 sui terremoti che si sono verificati in [br]una particolare regione geografica. 0:03:05.470,0:03:10.930 E come vedrete, quei dati vengono [br]restituiti in vari formati. 0:03:10.930,0:03:15.600 Inizialmente ci limiteremo a visualizzare [br]il testo così come viene scaricato. 0:03:15.600,0:03:18.660 Più avanti nella lezione, [br]vi mostrerò come processare 0:03:18.660,0:03:23.520 quei dati per estrarre solo le[br]informazioni che volete. 0:03:23.520,0:03:25.590 Oh, e un'altra cosa. 0:03:25.590,0:03:30.940 Come si vedrà tra un momento, poiché questi [br]dati includono informazioni geografiche, 0:03:30.940,0:03:35.870 sarebbero più adatti ad essere mostrati [br]su una mappa, piuttosto che come testo. 0:03:35.870,0:03:39.460 Ora, non lo faremo in questa lezione, [br]ma ricordatelo, 0:03:39.460,0:03:44.470 perché ci ritorneremo quando arriveremo [br]alla lezione su mappe e posizione. 0:03:45.900,0:03:52.460 Per far funzionare quest'applicazione, [br]il codice deve creare una richiesta http, 0:03:52.460,0:03:57.910 inviarla a un server, recuperare i [br]risultati, e quindi visualizzarli. 0:03:59.120,0:04:02.060 Android fornisce molte classi [br]per aiutare con questo. 0:04:03.450,0:04:07.000 Tre di cui parleremo ora sono [br]la classe Socket, 0:04:08.520,0:04:14.450 la classe HttpUrlConnection [br]e la classe AndroidHttpClient. 0:04:14.450,0:04:23.780 Ora lancerò l'applicazione[br]NetworkingSockets. 0:04:25.490,0:04:26.570 Come potete vedere, 0:04:26.570,0:04:31.580 quest'applicazione all'inizio visualizza un solo [br]pulsante etichettato "Load Data" (Carica i Dati). 0:04:32.920,0:04:39.040 Quando premo il pulsante, l'applicazione[br]emette una richiesta HTTP GET 0:04:39.040,0:04:45.520 a un server esterno, e quel server [br]risponderà con del complesso 0:04:45.520,0:04:47.890 che contiene i dati [br]dei terremoti richiesti. 0:04:49.400,0:04:52.650 Ok, quindi ora premo [br]il pulsante "Load Data" 0:04:53.810,0:04:57.320 e si possono vedere i dati richiesti. 0:04:58.800,0:05:03.330 Diamo un'occhiata al codice sorgente per[br]vedere cosa fa per ottenere i dati. 0:05:03.330,0:05:05.500 Ora qui ho aperto l'applicazione [br]nell'IDE. 0:05:08.530,0:05:10.330 Ora aprirò l'Activity principale di 0:05:10.330,0:05:16.550 questa applicazione, e qui sto mostrando [br]il listener del tasto "Load Data". 0:05:18.940,0:05:22.570 Quando si preme questo pulsante, [br]l'applicazione crea, e 0:05:22.570,0:05:27.970 quindi esegue, un AsyncTask [br]chiamato HttpGetTask. 0:05:29.280,0:05:30.150 Diamo un'occhiata a quella classe. 0:05:32.280,0:05:37.200 La classe HttpGetTask dichiara [br]in primo luogo alcune variabili, che 0:05:37.200,0:05:41.010 vengono utilizzate nella creazione [br]di una richiesta HTTP GET. 0:05:43.170,0:05:48.530 Quando viene chiamato il metodo execute, sul HttpGetTask, 0:05:48.530,0:05:50.470 viene chiamato il metodo [br]doInBackground. 0:05:52.290,0:05:57.490 E questo metodo inizia con la creazione [br]di un nuovo Socket,che verrà connesso 0:05:57.490,0:06:07.400 al computer host, api.geonames.org [br]sulla porta HTTP standard, porta 80. 0:06:07.400,0:06:11.700 Successivamente, il codice ottiene [br]l'OutputStream del Socket, 0:06:11.700,0:06:17.670 e quindi scrive l'HTTPGETCOMMAND, e questa [br]stringa sarà inviata al computer host, 0:06:18.860,0:06:22.830 che la interpreta come una HTTPGetRequest, 0:06:22.830,0:06:28.850 e quindi risponde inviando [br]i dati di risposta appropriati. 0:06:28.850,0:06:34.030 Quindi questo codice continua ottenendo[br]l'InputStream del Socket e 0:06:34.030,0:06:37.030 passandolo a un metodo [br]chiamato readStream. 0:06:38.740,0:06:43.830 Il metodo readStream infine legge i dati [br]di risposta dall'InputStream del Socket. 0:06:43.830,0:06:48.570 e quindi restituisce la risposta [br]come una singola stringa. 0:06:48.570,0:06:55.770 E questa stringa viene passata [br]al metodo onPostExecute che 0:06:55.770,0:07:01.580 viene eseguito sul thread principale e [br]che visualizza la risposta nella TextView. 0:07:02.740,0:07:05.230 Torniamo all'applicazione. 0:07:05.230,0:07:10.490 Si noterà che il testo di risposta include [br]non solo i dati dei terremoti, ma 0:07:10.490,0:07:14.020 anche gli header della risposta HTTP. 0:07:14.020,0:07:18.000 Ora, di norma, non vorrei [br]mostrare questo testo qui. 0:07:18.000,0:07:20.770 Voglio solamente mostrare i dati dei terremoti. 0:07:20.770,0:07:24.710 Quindi avrei dovuto [br]analizzare la risposta ed 0:07:24.710,0:07:26.640 estrarre solo i dati che volevo. 0:07:28.730,0:07:31.650 Inoltre, potreste aver notato [br]che non ho scritto alcun 0:07:31.650,0:07:36.490 codice per la gestione di errori necessario [br]per rendere quest'applicazione robusta. 0:07:37.830,0:07:42.420 E questi punti catturano abbastanza bene gli[br]svantaggi nell'usare i Socket. 0:07:42.420,0:07:44.030 Il livello è molto basso, 0:07:44.030,0:07:47.170 puoi scrivere qualsiasi cosa [br]tu voglia sul socket, 0:07:47.170,0:07:53.720 ma in cambio hai bisogno di gestire [br]tutti i dettagli del fare le richieste HTTP, 0:07:53.720,0:07:58.630 tutta la gestione degli errori, e tutto [br]il processing delle risposte HTTP. 0:08:02.250,0:08:09.140 La prossima implementazione che vedremo usa la classe HttpUrlConnection. 0:08:09.140,0:08:13.060 Questa classe fornisce un'interfaccia[br]di più alto livello, che gestisce più 0:08:13.060,0:08:18.990 dettagli del networking rispetto alla [br]classe Socket, ma come vedremo tra breve, 0:08:18.990,0:08:24.140 ha anche una API meno flessibile [br]della nostra ultima opzione, 0:08:24.140,0:08:27.299 la classe AndroidHttpClient. 0:08:28.590,0:08:32.539 Detto questo, voglio anche sottolineare [br]che il team Android non sta più 0:08:32.539,0:08:37.120 lavorando attivamente[br]sulla classe AndroidHttpClient, e 0:08:37.120,0:08:42.220 si sta concentrando sul miglioramento [br]della classe che vedremo ora. 0:08:42.220,0:08:46.860 Quindi guardiamo l'applicazione [br]di esempio, implementata questa volta 0:08:46.860,0:08:50.839 con la classe HttpUrlConnection. 0:08:53.100,0:08:57.490 Ora lancio l'applicazione NetworkingURL. 0:08:57.490,0:09:01.760 Come prima, quest'applicazione mostra [br]inizialmente un singolo pulsante 0:09:01.760,0:09:07.180 un singolo pulsante etichettato "Load Data" [br]e come prima, quando premo quel pulsante 0:09:07.180,0:09:11.740 l'applicazione emette [br]una richiesta HTTP GET 0:09:11.740,0:09:13.480 a un server esterno, 0:09:13.480,0:09:17.490 e tale server risponderà [br]con del testo complesso,[br] 0:09:17.490,0:09:20.520 contenente i dati richiesti sui terremoti. 0:09:20.520,0:09:21.180 Ok, 0:09:21.180,0:09:23.280 quindi ora premo [br]il pulsante "Load Data". 0:09:24.800,0:09:28.700 Si possono vedere i dati richiesti[br]apparire in una TextView. 0:09:29.740,0:09:34.670 Si noti, tuttavia, che stavolta gli header[br]della risposta HTTP sono stati rimossi. 0:09:36.630,0:09:38.960 Diamo un'occhiata al codice sorgente [br]e vediamo come funziona. 0:09:41.440,0:09:44.130 Ora, qui ho l'applicazione [br]aperta nell'IDE. 0:09:45.230,0:09:47.480 Ora apro la MainActivity di 0:09:47.480,0:09:53.140 di quest'applicazione, e qui mostro [br]il listener del pulsante "Load Data". 0:09:54.650,0:09:59.240 Come prima, quando si preme questo tasto, [br]l'applicazione crea e 0:09:59.240,0:10:02.640 quindi esegue un AsyncTask [br]chiamato HttpGetTask. 0:10:05.450,0:10:06.710 Guardiamo quella classe. 0:10:09.030,0:10:12.270 Quando il metodo execute viene [br]chiamato su HttpGetTask, 0:10:12.270,0:10:15.260 viene invocato il metodo doInBackground. 0:10:15.260,0:10:20.020 Tale metodo inizia creando [br]un nuovo oggetto URL e 0:10:20.020,0:10:24.830 passando una stringa URL per il servizio [br]desiderato come parametro. 0:10:26.780,0:10:31.510 Il codice chiama quindi il metodo [br]openConnection sull'oggetto URL, 0:10:31.510,0:10:36.020 che restituisce una HttpUrlConnection. 0:10:36.020,0:10:40.980 Quest'oggetto viene poi memorizzato in una[br]variabile chiamata httpURLConnection. 0:10:40.980,0:10:46.940 Il codice prosegue [br]ottenendo l'InputStream 0:10:46.940,0:10:51.000 della HttpUrlConnection[br]e passandola al metodo readStream. 0:10:52.650,0:10:56.930 E come prima, il metodo readStream[br]legge i dati di risposta dal flusso 0:10:56.930,0:11:02.170 di input del Socket, poi restituisce [br]la risposta come una singola stringa.[br] 0:11:03.310,0:11:08.980 Questa volta, però, la HttpUrlConnection[br]rimuove gli header 0:11:08.980,0:11:13.540 della risposta HTTP e gestisce [br]il controllo degli errori per te. 0:11:15.140,0:11:19.790 Ora questa stringa viene quindi passata [br]al metodo onPostExecute, 0:11:19.790,0:11:22.460 che mostra la risposta in una TextView. 0:11:25.120,0:11:27.750 La terza classe è AndroidHttpClient. 0:11:29.300,0:11:35.190 Questa classe è un'implementazione del [br]DefaultHttpClient del progetto Apache 0:11:36.380,0:11:39.300 e permette una grande personalizzazione. 0:11:39.300,0:11:45.210 In particolare, la classe divide [br]la transazione HTTP in un 0:11:45.210,0:11:48.940 oggetto richiesta [br]e in un oggetto risposta. 0:11:48.940,0:11:53.940 Quindi si possono creare sottoclassi che [br]personalizzano la gestione delle richieste 0:11:53.940,0:11:55.680 e delle loro risposte. 0:11:55.680,0:11:59.450 Ora conoscete già l'aspetto [br]dell'applicazione, quindi 0:11:59.450,0:12:02.640 quindi saltiamo direttamente al codice ed[br]esaminiamo l'implementazione. 0:12:05.470,0:12:10.370 Ora, qui ho aperto l'applicazione 0:12:10.370,0:12:11.290 NetworkingAndroidHttpClient nell'IDE. 0:12:13.050,0:12:18.350 Ora apro la MainActivity di questa [br]applicazione, e andiamo direttamente 0:12:18.350,0:12:25.290 alla classe HttpGetTask.[br]Tale classe inizia creando un nuovo 0:12:25.290,0:12:30.910 oggetto AndroidHttpClient, chiamando [br]il metodo newInstance della classe. 0:12:32.710,0:12:38.480 Quando viene chiamato il metodo [br]doInBackground, il codice crea 0:12:38.480,0:12:42.650 un oggetto HttpGet, passando la [br]stringa URL per quella richiesta. 0:12:43.710,0:12:47.320 Quindi, crea un oggetto ResponseHandler. 0:12:47.320,0:12:51.480 Quest'oggetto è responsabile [br]della gestione della risposta 0:12:51.480,0:12:57.560 alla richiesta HttpGet: in questo caso, [br]il ResponseHandler è del tipo 0:12:57.560,0:13:03.480 BasicResponseHandler, che restituirà il[br]corpo della risposta. 0:13:03.480,0:13:07.510 Vedremo un ResponseHandler più complesso [br]più avanti in questa lezione. 0:13:09.290,0:13:15.680 E, infine, la richiesta e il ResponseHandler [br]vengono passati al metodo execute, 0:13:15.680,0:13:21.400 che invia la richiesta e ottiene [br]la risposta, passandola attraverso il 0:13:21.400,0:13:29.090 ResponseHandler, e il risultato di tutto [br]questo viene poi passato ad onPostExecute, 0:13:29.090,0:13:31.343 che mostra la risposta in un campo di testo.