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