Această serie de instrucțiuni din două părți vă va prezenta principiile de lucru cu serviciile web RESTful utilizând SDK-ul Android. Pe parcurs, veți învăța cum să efectuați căutări în raport cu API-ul Twitter public!
În acest tutorial vom folosi AsyncTask pentru a prelua tweetsul JSON, pentru a le analiza, apoi a le afișa în interfața cu utilizatorul. Deși codul din acest tutorial este specific pentru Twitter, principiile implicate se aplică la extragerea multor alte fluxuri Web și a API-urilor utilizând o arhitectură RESTful.
Această serie de tutoriale pe Android Twitter Search are două părți:
Vom folosi un AsyncTask pentru a efectua preluarea, parsarea și afișarea fluxului de tweet pe interogarea de căutare a utilizatorului. Prin utilizarea AsyncTask, putem transforma procesarea într-un fir de fundal, rezultatele fiind încă accesibile pentru afișarea interfeței UI a aplicației. În clasa de activitate, adăugați o clasă internă AsyncTask după searchTwitter metodă:
clasa privată GetTweets extinde AsyncTask
Clasa AsyncTask este abstractă, ceea ce înseamnă că trebuie să creați o subclasă pentru ao folosi. Astfel de subclase trebuie să implementeze o metodă particulară pe care o vom adăuga în continuare. Între timp, Eclipse va afișa mesaje de eroare (ignorați-le pentru moment).
AsyncTask utilizează trei tipuri generice, după cum puteți vedea din linia de deschidere a declarației clasei. Primul specifică tipul de parametru - în cazul nostru este vorba de un șir, pe măsură ce vom transmite șirul de adrese URL pe care l-am creat. Tipul de mijloc este pentru unități de progres, pe care nu le vom folosi în acest tutorial, astfel încât pur și simplu să specificăm void. Unitățile de progres pot fi folosite pentru a indica progresul sarcinilor de fundal. Al treilea tip este un alt șir, pe care procesul de fundal se întoarce. În cazul nostru, acesta va fi textul feedului JSON preluat.
În interiorul clasei AsyncTask, adăugați următoarea metodă, pe care o înlocuim din clasa parentală:
@Override protejat String doInBackground (String ... twitterURL)
Tipul de parametru este șir, care se potrivește cu primul tip pe care l-am indicat în linia de deschidere a declarației de clasă. Acest șir va fi adresa URL de căutare Twitter API pe care am construit-o ultima dată. În cadrul acestei metode, specificăm ce proces de fundal vrem ca AsyncTask să efectueze. De asemenea, metoda returnează o valoare de șir de tip, pentru a se potrivi cu ceea ce am specificat ca parametru al treilea în linia de deschidere a clasei de declarație. Acest șir returnat va fi primit ca parametru pentru oa doua metodă, pe care o vom implementa mai târziu.
Bacsis: Dacă nu sunteți familiarizați cu clasele abstracte sau cu tipurile generice, nu vă faceți griji - ceea ce facem aici este doar urmând un model. Ca pe o mare parte din platforma Android, puteți învăța cum să utilizați aceste resurse din exemplele din Ghidul pentru dezvoltatori și, în acest caz, referința API.
Rezultatul căutării Twitter va fi un șir, pe care îl vom construi din răspunsul pe care îl primim. În interiorul doInBackground , începeți prin crearea unui constructor de șir:
StringBuilder tweetFeedBuilder = nou StringBuilder ();
Deși folosim un șir de URL unic, metoda va recepționa o serie de obiecte de tipul specificat (șir), așa că trebuie să procedăm prin ea:
pentru (String searchURL: twitterURL)
În realitate, bucla va repeta doar o singură dată, dar ați putea extinde codul pentru a prelua feed-uri multiple de căutare, așa că vom folosi acum o buclă. În interiorul buclă, creați un client HTTP pentru executarea solicitării:
HttpClient tweetClient = nou DefaultHttpClient ();
Acum avem nevoie de excepții de I / O, așa cum se întâmplă în mod invariabil atunci când încercați să preluați date de oriunde în afara aplicației. Adăuga încerca și captură blocuri:
încercați captura (Excepție e) tweetDisplay.setText ("Oameni - ceva nu a mers!"); e.printStackTrace ();
Dacă există o eroare de intrare / ieșire, scriem pur și simplu un mesaj către interfața cu utilizatorul. În interiorul încerca blocați, creați un obiect HTTP Get pentru a emite solicitarea, trecând adresa URL de căutare:
HttpGet tweetGet = noul HttpGet (searchURL);
Acum putem merge și executa cererea, stocând rezultatele într-un obiect HTTP Response:
HttpResponse tweetResponse = tweetClient.execut (tweetGet);
Vom putea folosi obiectul de răspuns pentru a accesa conținutul și starea mesajului de răspuns primit de la Twitter.
Înainte de a încerca să procesăm mesajul de răspuns, să verificăm starea. Încă înăuntru încerca bloc:
StatusLine căutareStatus = tweetResponse.getStatusLine ();
Dacă răspunsul este OK, putem continua și încercăm să analizăm tweets-ul, altfel vom trimite un mesaj de eroare utilizatorului:
dacă (searchStatus.getStatusCode () == 200) altceva tweetDisplay.setText ("Oameni - ceva nu a mers!");
În interiorul dacă , putem acum să preluăm entitatea HTTP și conținutul mesajului ca flux de intrare:
HttpEntity tweetEntity = tweetResponse.getEntity (); InputStream tweetContent = tweetEntity.getContent ();
Acum putem începe să aducem conținutul mesajului în program, folosind un cititor de fluxuri de intrare mai degrabă decât un cititor tampon pentru gestionarea datelor primite:
InputStreamReader tweetInput = noul InputStreamReader (tweetContent); BufferedReader tweetReader = nou BufferedReader (tweetInput);
Să citim în date o linie la un moment dat, adăugând fiecare linie către constructorul de caractere pe care l-am creat:
String lineIn; în timp ce ((lineIn = tweetReader.readLine ())! = null) tweetFeedBuilder.append (lineIn);
Aceasta va continua să se adauge la constructorul de caractere până când toate datele primite au fost procesate. Acum treceți la partea de jos a doInBackground după metoda captură bloc - returnează șirul pe care l-am construit în:
returnează tweetFeedBuilder.toString ();
Asta este doInBackground metoda completă - efectuează preluarea fluxului tweet și importul în aplicație, deci acum îl putem parsa și afișa.
Acum că AsyncTask a preluat feedul tweet, îl putem parsa și îl afișăm în interfața noastră de aplicație. Pentru aceasta putem implementa o altă metodă a clasei AsyncTask, adăugată ulterior doInBackground, încă în declarația clasei AsyncTask:
protejat void onPostExecute (rezultatul String)
Observați că această metodă primește un parametru șir, care este cel pe care l-am specificat ca fiind cel de-al treilea tip în linia de declarație a clasei de deschidere și de la ce am returnat doInBackground în ultimul pas. Șirul este textul JSON reprezentând tweet-urile recente din termenii de căutare utilizatori extrași de pe Twitter. Va trebui să analizăm acest text pentru a accesa conținutul tweets și a le afișa în interfața de utilizare.
Vom construi textul tweet într-un șir pentru afișare, așa că porniți onPostExecute metodă prin crearea unui alt String Builder:
StringBuilder tweetResultBuilder = nou StringBuilder ();
Metodele de procesare JSON pot arunca excepții, deci adăugați încerca și captură blocuri următoare:
încercați captura (Excepție e) tweetDisplay.setText ("Oameni - ceva nu a mers!"); e.printStackTrace ();
Ar trebui să observați un model aici - ca în cazul oricărui program în care încercați să preluați și să procesați date externe, trebuie să acordați o atenție deosebită gestionării eventualelor erori.
În interiorul încerca blocați, creați un obiect JSON, trecând șirul de text JSON:
JSONObject resultObject = nou JSONObject (rezultat);
În interiorul șirului de text JSON este un șir care conține tweets și câteva alte date - efectuați o interogare Twitter inserând adresa URL de căutare în bara de adrese a browserului dvs., așa cum am făcut ultima oară, de exemplu:
http://search.twitter.com/search.json?q=android
Este posibil să fie necesar să copiați și să inserați textul rezultat într-un editor de text pentru al citi în mod eficient. Dacă te uiți prin textul JSON, vei vedea următoarea secțiune, care marchează începutul matricei tweet:
"rezultate": [
Trebuie să preluăm această matrice tweet, folosind numele ei: "rezultate". Obțineți matricea "rezultate" din Obiectul JSON:
JSONArray tweetArray = resultObject.getJSONArray ("rezultate");
Acum ne putem conecta prin tweets și le putem pregăti pentru afișare.
Dacă vă uitați din nou la textul JSON regăsit prin browser (sau, opțional, în Eclipse, dacă îl scrieți în jurnalul Android în timp ce rulează aplicația), puteți vedea conținutul returnat pentru fiecare tweet în matrice. În acest tutorial vom scrie doar numele de utilizator al tweeting-ului contului și conținutul tweet-ului în sine. Puteți extinde aplicația pentru a include oricare dintre informațiile pe care le doriți. În textul returnat de pe Twitter, numele de utilizator este reprezentat ca "from_user" și conținutul tweet-ului este denumit "text" - uitați-vă la conținutul JSON pentru a verifica acest lucru și pentru a vedea ce alte elemente de date sunt acolo.
În tine încerca blocați, după preluarea matricei tweet, adăugați a pentru buclă pentru a itera prin tweet-uri:
pentru (int t = 0;În interiorul buclei, obțineți fiecare element ca obiect JSON:
JSONObject tweetObject = tweetArray.getJSONObject (t);Acum, recuperați numele de utilizator din acest obiect, adăugând-l la constructorul de caractere, împreună cu un text suplimentar pentru afișare:
tweetResultBuilder.append (tweetObject.getString ("din_user") + ":");Clasa obiect JSON oferă o getString în acest scop; există și o alternativă obține metodă. Acum, preluați și adăugați conținutul tweet:
tweetResultBuilder.append (tweetObject.get ( "text") + "\ n \ n");
Pasul 7: Afișați rezultatele
Acum treceți după captură bloc în interiorul onPostExecute metodă. Dacă procesarea a funcționat, vom afișa rezultatul în Text View, altfel vom afișa un mesaj de eroare:
dacă (tweetResultBuilder.length ()> 0) tweetDisplay.setText (tweetResultBuilder.toString ()); altceva tweetDisplay.setText ("Ne pare rau - nu s-au gasit tweets pentru cautarea ta!");Clasa AsyncTask este acum completă.
Pasul 8: Instanțiați & Executați AsyncTask
Avem un AsyncTask pentru a efectua procesarea noastră; trebuie doar să-i sunăm. Mergeți înapoi la dvs. searchTwitter metoda, în interiorul încerca bloc și după ce am construit șirul de adresă de interogare de căutare. Creați o instanță a noii clase AsyncTask și apelați a executa pe aceasta, trecând șirul de adrese URL:
noul GetTweets () executa (searchURL);Observați că treceți un șir, ceea ce am specificat în declarația AsyncTask și doInBackground metodă.
Aceasta este completă aplicația de bază - o puteți testa în emulator și pe dispozitivele Android. Încearcă-l cu diferite interogări de căutare, cum ar fi hashtag-uri. Puteți extinde, desigur, aplicația pentru a afișa mai multe informații de la tweets și chiar pentru a vă conecta la Twitter pe clicurile utilizatorilor. În starea actuală, utilizatorul poate naviga prin feedul tweet returnat și poate efectua căutări repetate după cum doresc.
Concluzie
În aceste două tutoriale am explorat preluarea de tweets din API-ul de căutare Twitter. Puteți utiliza aceleași modele de design pentru a prelua date din alte resurse Web. Dacă aplicațiile dvs. vor implica procese mai complexe de recuperare a datelor, vă recomandăm să consultați furnizorii de conținut și, opțional, serviciile pentru a maximiza eficiența. Ca și în cazul oricăror operațiuni bazate pe date externe, nu puteți presupune că recuperarea informațiilor de care aveți nevoie va avea succes, deci un nivel de gestionare a erorilor este esențial. Abilitatea de a accesa datele de pe Internet este, bineînțeles, unul dintre avantajele cheie pentru calculatoarele mobile, astfel că aceste tehnici sunt o componentă vitală în orice casetă de instrumente pentru dezvoltatorii Android.