1 00:00:00,013 --> 00:00:10,013 [MUSICA] 2 00:00:15,594 --> 00:00:20,836 Una delle caratteristiche distintive dei sistemi mobile moderni è che essi possono 3 00:00:20,836 --> 00:00:26,170 tenerci collegati in rete senza tenerci legati a una singola locazione. 4 00:00:27,550 --> 00:00:30,640 In questa lezione, esploreremo il software e 5 00:00:30,640 --> 00:00:35,840 le pratiche di programmazione che servono per collegare le applicazioni alla rete. 6 00:00:37,230 --> 00:00:41,370 Quindi inizierò questa lezione discutendo del networking in generale. 7 00:00:41,370 --> 00:00:46,080 Tale discussione si concentrerà sul collegamento delle app a Internet 8 00:00:46,080 --> 00:00:49,960 usando l'HyperText Transfer Protocol 9 00:00:49,960 --> 00:00:55,420 o HTTP, precisamente tramite richieste HTTP GET. 10 00:00:56,940 --> 00:01:02,040 Dopo di che, vi presenterò diverse classi che Android offre per supportare questo 11 00:01:02,040 --> 00:01:06,760 tipo di networking e infine, discuterò di come le applicazioni possono 12 00:01:06,760 --> 00:01:12,710 elaborare i dati ricevuti in risposta a queste richieste HTTP GET. 13 00:01:12,710 --> 00:01:17,590 In particolare, parlerò di due popolari linguaggi di formattazione dei dati. 14 00:01:17,590 --> 00:01:21,450 Uno, il JavaScript Object Notation Language, 15 00:01:21,450 --> 00:01:27,150 o JSON e due, l'Extensible Markup Language, o XML. 16 00:01:27,150 --> 00:01:31,700 E parlerò di come si analizzano, o si capiscono, 17 00:01:31,700 --> 00:01:36,578 queste risposte HTTP quando sono formattate in uno di questi linguaggi. 18 00:01:36,578 --> 00:01:41,410 Dunque, i primi dispositivi palmari ci hanno dato la mobilità. 19 00:01:41,410 --> 00:01:46,250 Ci si poteva spostare da un luogo all'altro, ed eseguire comunque computazioni utili. 20 00:01:47,270 --> 00:01:52,840 Tuttavia, le loro capacità di networking erano primitive per gli standard odierni. 21 00:01:52,840 --> 00:01:57,820 Ora, andando avanti, i dispositivi di oggi combinano potenti processori con 22 00:01:57,820 --> 00:02:02,550 veloci connessioni di rete via WiFi e reti cellulari. 23 00:02:03,670 --> 00:02:08,275 Le applicazioni portatili quindi vorranno spesso far uso 24 00:02:08,275 --> 00:02:14,040 di queste funzionalità di rete per accedere a dati e servizi e fornirne. 25 00:02:15,710 --> 00:02:21,510 Per aiutarvi a farlo, Android include una varietà di classi di supporto al netwoking 26 00:02:21,510 --> 00:02:26,889 tra cui le classi Socket e URL, nei package java.net, 27 00:02:28,020 --> 00:02:36,750 le classi HttpRequest e HttpResponse, nei package org.apache. 28 00:02:36,750 --> 00:02:44,630 E le classi URI, AndroidHttpClient, e AudioStream, nei package android.net. 29 00:02:46,220 --> 00:02:50,620 In questa lezione guarderemo molte di queste classi, 30 00:02:50,620 --> 00:02:54,700 usando ciascuna di esse per implementare la stessa applicazione di esempio. 31 00:02:55,720 --> 00:03:01,290 Quest'applicazione interagisce con un servizio internet per ottenere informazioni 32 00:03:01,290 --> 00:03:05,470 sui terremoti che si sono verificati in una particolare regione geografica. 33 00:03:05,470 --> 00:03:10,930 E come vedrete, quei dati vengono restituiti in vari formati. 34 00:03:10,930 --> 00:03:15,600 Inizialmente ci limiteremo a visualizzare il testo così come viene scaricato. 35 00:03:15,600 --> 00:03:18,660 Più avanti nella lezione, vi mostrerò come processare 36 00:03:18,660 --> 00:03:23,520 quei dati per estrarre solo le informazioni che volete. 37 00:03:23,520 --> 00:03:25,590 Oh, e un'altra cosa. 38 00:03:25,590 --> 00:03:30,940 Come si vedrà tra un momento, poiché questi dati includono informazioni geografiche, 39 00:03:30,940 --> 00:03:35,870 sarebbero più adatti ad essere mostrati su una mappa, piuttosto che come testo. 40 00:03:35,870 --> 00:03:39,460 Ora, non lo faremo in questa lezione, ma ricordatelo, 41 00:03:39,460 --> 00:03:44,470 perché ci ritorneremo quando arriveremo alla lezione su mappe e posizione. 42 00:03:45,900 --> 00:03:52,460 Per far funzionare quest'applicazione, il codice deve creare una richiesta http, 43 00:03:52,460 --> 00:03:57,910 inviarla a un server, recuperare i risultati, e quindi visualizzarli. 44 00:03:59,120 --> 00:04:02,060 Android fornisce molte classi per aiutare con questo. 45 00:04:03,450 --> 00:04:07,000 Tre di cui parleremo ora sono la classe Socket, 46 00:04:08,520 --> 00:04:14,450 la classe HttpUrlConnection e la classe AndroidHttpClient. 47 00:04:14,450 --> 00:04:23,780 Ora lancerò l'applicazione NetworkingSockets. 48 00:04:25,490 --> 00:04:26,570 Come potete vedere, 49 00:04:26,570 --> 00:04:31,580 quest'applicazione all'inizio visualizza un solo pulsante etichettato "Load Data" (Carica i Dati). 50 00:04:32,920 --> 00:04:39,040 Quando premo il pulsante, l'applicazione emette una richiesta HTTP GET 51 00:04:39,040 --> 00:04:45,520 a un server esterno, e quel server risponderà con del complesso 52 00:04:45,520 --> 00:04:47,890 che contiene i dati dei terremoti richiesti. 53 00:04:49,400 --> 00:04:52,650 Ok, quindi ora premo il pulsante "Load Data" 54 00:04:53,810 --> 00:04:57,320 e si possono vedere i dati richiesti. 55 00:04:58,800 --> 00:05:03,330 Diamo un'occhiata al codice sorgente per vedere cosa fa per ottenere i dati. 56 00:05:03,330 --> 00:05:05,500 Ora qui ho aperto l'applicazione nell'IDE. 57 00:05:08,530 --> 00:05:10,330 Ora aprirò l'Activity principale di 58 00:05:10,330 --> 00:05:16,550 questa applicazione, e qui sto mostrando il listener del tasto "Load Data". 59 00:05:18,940 --> 00:05:22,570 Quando si preme questo pulsante, l'applicazione crea, e 60 00:05:22,570 --> 00:05:27,970 quindi esegue, un AsyncTask chiamato HttpGetTask. 61 00:05:29,280 --> 00:05:30,150 Diamo un'occhiata a quella classe. 62 00:05:32,280 --> 00:05:37,200 La classe HttpGetTask dichiara in primo luogo alcune variabili, che 63 00:05:37,200 --> 00:05:41,010 vengono utilizzate nella creazione di una richiesta HTTP GET. 64 00:05:43,170 --> 00:05:48,530 Quando viene chiamato il metodo execute, sul HttpGetTask, 65 00:05:48,530 --> 00:05:50,470 viene chiamato il metodo doInBackground. 66 00:05:52,290 --> 00:05:57,490 E questo metodo inizia con la creazione di un nuovo Socket,che verrà connesso 67 00:05:57,490 --> 00:06:07,400 al computer host, api.geonames.org sulla porta HTTP standard, porta 80. 68 00:06:07,400 --> 00:06:11,700 Successivamente, il codice ottiene l'OutputStream del Socket, 69 00:06:11,700 --> 00:06:17,670 e quindi scrive l'HTTPGETCOMMAND, e questa stringa sarà inviata al computer host, 70 00:06:18,860 --> 00:06:22,830 che la interpreta come una HTTPGetRequest, 71 00:06:22,830 --> 00:06:28,850 e quindi risponde inviando i dati di risposta appropriati. 72 00:06:28,850 --> 00:06:34,030 Quindi questo codice continua ottenendo l'InputStream del Socket e 73 00:06:34,030 --> 00:06:37,030 passandolo a un metodo chiamato readStream. 74 00:06:38,740 --> 00:06:43,830 Il metodo readStream infine legge i dati di risposta dall'InputStream del Socket. 75 00:06:43,830 --> 00:06:48,570 e quindi restituisce la risposta come una singola stringa. 76 00:06:48,570 --> 00:06:55,770 E questa stringa viene passata al metodo onPostExecute che 77 00:06:55,770 --> 00:07:01,580 viene eseguito sul thread principale e che visualizza la risposta nella TextView. 78 00:07:02,740 --> 00:07:05,230 Torniamo all'applicazione. 79 00:07:05,230 --> 00:07:10,490 Si noterà che il testo di risposta include non solo i dati dei terremoti, ma 80 00:07:10,490 --> 00:07:14,020 anche gli header della risposta HTTP. 81 00:07:14,020 --> 00:07:18,000 Ora, di norma, non vorrei mostrare questo testo qui. 82 00:07:18,000 --> 00:07:20,770 Voglio solamente mostrare i dati dei terremoti. 83 00:07:20,770 --> 00:07:24,710 Quindi avrei dovuto analizzare la risposta ed 84 00:07:24,710 --> 00:07:26,640 estrarre solo i dati che volevo. 85 00:07:28,730 --> 00:07:31,650 Inoltre, potreste aver notato che non ho scritto alcun 86 00:07:31,650 --> 00:07:36,490 codice per la gestione di errori necessario per rendere quest'applicazione robusta. 87 00:07:37,830 --> 00:07:42,420 E questi punti catturano abbastanza bene gli svantaggi nell'usare i Socket. 88 00:07:42,420 --> 00:07:44,030 Il livello è molto basso, 89 00:07:44,030 --> 00:07:47,170 puoi scrivere qualsiasi cosa tu voglia sul socket, 90 00:07:47,170 --> 00:07:53,720 ma in cambio hai bisogno di gestire tutti i dettagli del fare le richieste HTTP, 91 00:07:53,720 --> 00:07:58,630 tutta la gestione degli errori, e tutto il processing delle risposte HTTP. 92 00:08:02,250 --> 00:08:09,140 La prossima implementazione che vedremo usa la classe HttpUrlConnection. 93 00:08:09,140 --> 00:08:13,060 Questa classe fornisce un'interfaccia di più alto livello, che gestisce più 94 00:08:13,060 --> 00:08:18,990 dettagli del networking rispetto alla classe Socket, ma come vedremo tra breve, 95 00:08:18,990 --> 00:08:24,140 ha anche una API meno flessibile della nostra ultima opzione, 96 00:08:24,140 --> 00:08:27,299 la classe AndroidHttpClient. 97 00:08:28,590 --> 00:08:32,539 Detto questo, voglio anche sottolineare che il team Android non sta più 98 00:08:32,539 --> 00:08:37,120 lavorando attivamente sulla classe AndroidHttpClient, e 99 00:08:37,120 --> 00:08:42,220 si sta concentrando sul miglioramento della classe che vedremo ora. 100 00:08:42,220 --> 00:08:46,860 Quindi guardiamo l'applicazione di esempio, implementata questa volta 101 00:08:46,860 --> 00:08:50,839 con la classe HttpUrlConnection. 102 00:08:53,100 --> 00:08:57,490 Ora lancio l'applicazione NetworkingURL. 103 00:08:57,490 --> 00:09:01,760 Come prima, quest'applicazione mostra inizialmente un singolo pulsante 104 00:09:01,760 --> 00:09:07,180 un singolo pulsante etichettato "Load Data" e come prima, quando premo quel pulsante 105 00:09:07,180 --> 00:09:11,740 l'applicazione emette una richiesta HTTP GET 106 00:09:11,740 --> 00:09:13,480 a un server esterno, 107 00:09:13,480 --> 00:09:17,490 e tale server risponderà con del testo complesso, 108 00:09:17,490 --> 00:09:20,520 contenente i dati richiesti sui terremoti. 109 00:09:20,520 --> 00:09:21,180 Ok, 110 00:09:21,180 --> 00:09:23,280 quindi ora premo il pulsante "Load Data". 111 00:09:24,800 --> 00:09:28,700 Si possono vedere i dati richiesti apparire in una TextView. 112 00:09:29,740 --> 00:09:34,670 Si noti, tuttavia, che stavolta gli header della risposta HTTP sono stati rimossi. 113 00:09:36,630 --> 00:09:38,960 Diamo un'occhiata al codice sorgente e vediamo come funziona. 114 00:09:41,440 --> 00:09:44,130 Ora, qui ho l'applicazione aperta nell'IDE. 115 00:09:45,230 --> 00:09:47,480 Ora apro la MainActivity di 116 00:09:47,480 --> 00:09:53,140 di quest'applicazione, e qui mostro il listener del pulsante "Load Data". 117 00:09:54,650 --> 00:09:59,240 Come prima, quando si preme questo tasto, l'applicazione crea e 118 00:09:59,240 --> 00:10:02,640 quindi esegue un AsyncTask chiamato HttpGetTask. 119 00:10:05,450 --> 00:10:06,710 Guardiamo quella classe. 120 00:10:09,030 --> 00:10:12,270 Quando il metodo execute viene chiamato su HttpGetTask, 121 00:10:12,270 --> 00:10:15,260 viene invocato il metodo doInBackground. 122 00:10:15,260 --> 00:10:20,020 Tale metodo inizia creando un nuovo oggetto URL e 123 00:10:20,020 --> 00:10:24,830 passando una stringa URL per il servizio desiderato come parametro. 124 00:10:26,780 --> 00:10:31,510 Il codice chiama quindi il metodo openConnection sull'oggetto URL, 125 00:10:31,510 --> 00:10:36,020 che restituisce una HttpUrlConnection. 126 00:10:36,020 --> 00:10:40,980 Quest'oggetto viene poi memorizzato in una variabile chiamata httpURLConnection. 127 00:10:40,980 --> 00:10:46,940 Il codice prosegue ottenendo l'InputStream 128 00:10:46,940 --> 00:10:51,000 della HttpUrlConnection e passandola al metodo readStream. 129 00:10:52,650 --> 00:10:56,930 E come prima, il metodo readStream legge i dati di risposta dal flusso 130 00:10:56,930 --> 00:11:02,170 di input del Socket, poi restituisce la risposta come una singola stringa. 131 00:11:03,310 --> 00:11:08,980 Questa volta, però, la HttpUrlConnection rimuove gli header 132 00:11:08,980 --> 00:11:13,540 della risposta HTTP e gestisce il controllo degli errori per te. 133 00:11:15,140 --> 00:11:19,790 Ora questa stringa viene quindi passata al metodo onPostExecute, 134 00:11:19,790 --> 00:11:22,460 che mostra la risposta in una TextView. 135 00:11:25,120 --> 00:11:27,750 La terza classe è AndroidHttpClient. 136 00:11:29,300 --> 00:11:35,190 Questa classe è un'implementazione del DefaultHttpClient del progetto Apache 137 00:11:36,380 --> 00:11:39,300 e permette una grande personalizzazione. 138 00:11:39,300 --> 00:11:45,210 In particolare, la classe divide la transazione HTTP in un 139 00:11:45,210 --> 00:11:48,940 oggetto richiesta e in un oggetto risposta. 140 00:11:48,940 --> 00:11:53,940 Quindi si possono creare sottoclassi che personalizzano la gestione delle richieste 141 00:11:53,940 --> 00:11:55,680 e delle loro risposte. 142 00:11:55,680 --> 00:11:59,450 Ora conoscete già l'aspetto dell'applicazione, quindi 143 00:11:59,450 --> 00:12:02,640 quindi saltiamo direttamente al codice ed esaminiamo l'implementazione. 144 00:12:05,470 --> 00:12:10,370 Ora, qui ho aperto l'applicazione 145 00:12:10,370 --> 00:12:11,290 NetworkingAndroidHttpClient nell'IDE. 146 00:12:13,050 --> 00:12:18,350 Ora apro la MainActivity di questa applicazione, e andiamo direttamente 147 00:12:18,350 --> 00:12:25,290 alla classe HttpGetTask. Tale classe inizia creando un nuovo 148 00:12:25,290 --> 00:12:30,910 oggetto AndroidHttpClient, chiamando il metodo newInstance della classe. 149 00:12:32,710 --> 00:12:38,480 Quando viene chiamato il metodo doInBackground, il codice crea 150 00:12:38,480 --> 00:12:42,650 un oggetto HttpGet, passando la stringa URL per quella richiesta. 151 00:12:43,710 --> 00:12:47,320 Quindi, crea un oggetto ResponseHandler. 152 00:12:47,320 --> 00:12:51,480 Quest'oggetto è responsabile della gestione della risposta 153 00:12:51,480 --> 00:12:57,560 alla richiesta HttpGet: in questo caso, il ResponseHandler è del tipo 154 00:12:57,560 --> 00:13:03,480 BasicResponseHandler, che restituirà il corpo della risposta. 155 00:13:03,480 --> 00:13:07,510 Vedremo un ResponseHandler più complesso più avanti in questa lezione. 156 00:13:09,290 --> 00:13:15,680 E, infine, la richiesta e il ResponseHandler vengono passati al metodo execute, 157 00:13:15,680 --> 00:13:21,400 che invia la richiesta e ottiene la risposta, passandola attraverso il 158 00:13:21,400 --> 00:13:29,090 ResponseHandler, e il risultato di tutto questo viene poi passato ad onPostExecute, 159 00:13:29,090 --> 00:13:31,343 che mostra la risposta in un campo di testo.