An Introduksjon til Volley
60
Del
11
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert å bare $ 3. Ikke gå glipp av.
Dette innlegget er en del av en serie som heter An Introduction to Volley.Creating en Været Søknad om Mars Bruke Volley
Volley er anetworking bibliotek utviklet av Google og introduserte under Google I /O 2013. Det ble utviklet fordi ofthe fravær, i Android SDK, et nettverk klasse stand til å arbeide uten å forstyrre brukeropplevelsen.
Inntil utgivelsen av Volley, den kanoniske Java klasse java.net.HttpURLConnection og Apache org .apache.http.client var de eneste verktøy tilgjengelig for Android-programmerere, å utvikle en fredfylt system mellom en klient og en ekstern backend.
Puttingaside for et øyeblikk at disse to klassene er ikke fritatt for bugs, itshould bemerkes hvordan alt som gikk utover en enkel HTTP transaksjon måtte skrives ex novo .
Hvis du ønsket å cache bilder, eller prioritere forespørsler, måtte du utvikle det fra bunnen av .
Heldigvis, nå er det Volley, opprettet og skreddersydd for å oppfylle disse behovene. Anmeldelser
1. Hvorfor Volley?
Unngå HttpUrlConnectionand HttpClient
På lowerAPI nivåer (for det meste på Gingerbread og Froyo), HttpUrlConnection og HttpClient er langt fra å være perfekt. Det er noen knownissues og bugs som aldri ble løst. Videre HttpClient ble foreldet i den siste API oppdateringen (API 22), noe som betyr at det ikke lenger vil bli opprettholdt og kan beremoved i en fremtidig utgave.
Dette er tilstrekkelige grunner for å bestemme seg for å bytte til en morereliable måte håndtere dine nettverksforespørsler.
Og Unngå AsyncTask Too
Siden introduksjonen av Honeycomb (API 11), har det vært obligatorisk å utføre nettverksoperasjoner på En separat tråd, forskjellig fra hovedtråden. Dette vesentlig endring ledet an til massive bruk av AsyncTask < Params, Progress, Resultat > spesifikasjonen.
Med AsyncTask, må du først definere noen forberedende handlinger, som for eksempel definisjonen av konteksten, i onPreExecute. Du kan deretter utføre asynkrone oppgaver ved hjelp av doInBackground metoden. Til slutt, du håndtere resultatene i onPostExecute. Det er ganske grei, måten lettere enn gjennomføringen av en tjeneste, og kommer med massevis ofexamples og dokumentasjon.
mainproblem, er imidlertid serialisering av samtalene. Bruke AsyncTask klassen, youcan't bestemme hvilke forespørsel går først, og som man må vente. Alt skjer FIFO, først inn, først ut.
Theproblems oppstå, for eksempel når du må laste inn en liste over elementer som har festet et miniatyrbilde. Når brukeren beveger seg ned og forventer nye resultater, kan du ikke fortelle din aktivitet for å først laste den JSONof neste side og bare da bilder av de tidligere one.This kan bli et alvorlig brukeropplevelse problem i applikasjoner som Facebook eller Twitter , der listen over nye elementer er viktigere enn thumbnailassociated med det.
Volley tar sikte på å løse dette problemet ved å inkludere en kraftig avbestillings API. Du trenger ikke lenger å sjekke inn onPostExecute om theactivity ble ødelagt mens du utfører samtalen. Dette bidrar til å unngå en uønsket NullPointerException.
Det er mye raskere
For en tid siden, Google + teamet gjorde en rekke ytelsestester på hver av de differentmethods du kan bruke til å lage nettverksforespørsler på Android . Volley fikk en score opp til ti ganger bedre enn de andre alternativene når det brukes i RESTful applikasjoner.
Den bufrer Alt
Volley bufrer forespørsler automatisk, og dette er noe virkelig livreddende. La oss gå tilbake et øyeblikk til eksempelet jeg ga tidligere. Du har en liste over elementer-en JSON utvalg la oss si-og hvert element har en beskrivelse og et miniatyrbilde knyttet til den. Nå tenke på hva som skjer hvis brukeren roterer skjermen: aktiviteten isdestroyed, listen er lastet ned på nytt, og så er bildene. Lang historie kort, en betydelig avfalls ofresources og en dårlig brukeropplevelse.
Volley viser seg å være svært nyttig for å overvinne dette problemet. Det husker Volleyis perfekt Det er ikke så bra, men når ansatt for streaming drift og store nedlastinger. I motsetning til vanlig oppfatning, Volley er namedoesn't kommer fra sporten ordbok. Det er heller ment som repeatedbursts av samtaler, gruppert sammen. Det er liksom intuitivt hvorfor dette biblioteket ikke komme godt med når, i stedet for en salve av piler, vil du tofire en kanonkule. Volleyworks på tre forskjellige nivåer med hvert nivå opererer på sin egen tråd. På mainthread, konsekvent med det du allerede gjør i AsyncTask spesifikasjonen, er det bare tillatt å fyre forespørselen og håndtere sin respons. Intet mer, intet mindre. Den viktigste konsekvensen er at du faktisk kan ignorere alt som wasgoing på i doInBackground metoden. Volley styrer automatisk HTTP transaksjoner og fangstnettverksfeil som du trengte å bry seg om før. Når youadd en forespørsel til køen, skjer flere ting under panseret. Først Volleychecks dersom anmodningen kan betjenes fra cache. Hvis det kan blir cachedresponse lest, analysert, og levert. Ellers ispassed den til nettverket tråden. På thenetwork tråd, er en round-robin med en rekke tråder arbeider kontinuerlig. Thefirst tilgjengelig nettverk tråden dequeues forespørselen, gjør HTTP-forespørsel, analyserer respons, og skriver det tocache. Til slutt, sender det analysert svar tilbake til hovedtråden hvor lytterne venter på å håndtere resultatet. Volley er ikke så praktisk å sette opp. Det ser ut som om det er ingen offisiell Maven repository tilgjengelig, og dette er ganske forvirrende. Du har torely på den offisielle kildekoden. Du kan importere Volley en av flere måter. Firstthings første, laste ned Volley kilde fra depotet. Hvis du føler deg trygg å gjøre dette, kan dette Git kommandoen gjør allthe arbeidet for deg: Untilsome uker siden, kan du pakke alt opp ved hjelp mauren kommandolinje (android oppdatering prosjekt -p. og deretter maur krukke) og importere din JAR biblioteket i din Android Studio prosjekt med en enkel Kompilerings- filer ('libs /volley.jar'). Nylig, skjønt, Google oppdatert Volley til Android Studio bygge stil, noe som gjør det vanskeligere å skape en frittstående JAR. Du kan fortsatt gjøre det, men bare med eldre versjoner av biblioteket. Jeg personallydiscourage deg å bruke dette valget, selv om det kan virke raskest. Du bør sette opp Volley klassisk måte Det er en tredje vei. Du kan legge til avhengighet delen av build.gradle filen denne linjen: Det er et speil kopi av officialGoogle depotet, regelmessig synkroniseres og oppdatert. Det er trolig den enkleste andfastest måten å komme i gang. Vær imidlertid oppmerksom på, er det en uoffisielle Etter min mening, er det likevel bedre å investere noen få minutter å importere den offisielle kildekoden. På denne måten kan du enkelt hoppe til de opprinnelige definisjoner og implementeringer, slik at i tilfelle av tvil, kan du alltid stole på den offisielle Volley kilde og selv endre det hvis du trenger å Volley hovedsakelig arbeider med bare to klasser, RequestQueue og Request. Du først opprette en RequestQueue, som forvalter arbeideren tråder og leverer de analyserte resultatene tilbake til hovedtråden. Du kan deretter gi det en eller flere Request stedene. Request konstruktør alltid tar som parameter metoden type (GET, POST, etc.), nettadressen til ressursen, og hendelsen lyttere. Deretter, avhengig av hvilken type forespørselen, kan den be om noen flere variabler. Inthe følgende eksempel lager jeg en RequestQueue objekt ved å påberope en av Volley sin praktiske metoder, Volley.newRequestQueue. Dette setter opp en RequestQueue objekt, ved hjelp defaultvalues definert av Som du cansee, det er utrolig grei. Du oppretter anmodningen og legge den til forespørselen køen. Og du er ferdig. Merk at lytteren Syntaksen er lik AsyncTask.onPostExecute, rett og slett blir det onResponse. Dette er ikke en tilfeldighet. Utviklerne som jobbet på Volley målbevisst gjort bibliotekets API så lik theAsyncTask metoder. Dette gjør overgangen fra å bruke AsyncTask volley det mye enklere. Hvis du har til å skyte flere forespørsler i flere aktiviteter, bør du unngå å bruke de ovennevnte tilnærming, Volley.newRequestQueue.add. Det er mye Vi får se spesielt for å utvikle noe som dette i neste opplæringen av denne serien. Volley kommer godt med for å gjennomføre tre svært vanlige forespørselstyper: Hver av disse klassene forlenge Resultat klasse som vi brukte tidligere. Vi har allerede lookedat den StringRequest i forrige eksempel. La oss se stedet hvor en JsonRequest fungerer. Vakkert. Er det ikke? Som du kan se, er den type resultat allerede satt til JSONObject. Du kan be om en JSONArray også hvis du vil, ved hjelp av en JsonArrayRequest i stedet for et JsonObjectRequest. Som før, er det første parameter i konstruktøren HTTP-metoden å bruke. Du kan deretter gi nettadressen for å hente JSON fra. Den tredje variable i eksemplet ovenfor er null. Dette er greit som det tyder på at noen parametere vil bli lagt ut sammen med forespørselen. Til slutt har du lytteren å motta JSON respons og en feil lytteren. Du kan passere i null hvis du vil ignorere feil. Henter bilder krever litt mer arbeid. Det er tre mulige metoder for deres interesse for et bilde. ImageRequestis standard en. Den viser bildet du ønsker en felles Imageview, hente den via en gitt URL. Alle dekodings andresizing operasjoner kan det være lurt Volley å utføre skje på en arbeidstaker tråd. Det andre alternativet er ImageLoader klassen, som du kan tenke på som en orchestrator av en largenumber av ImageRequests, for eksempel for å fylle en Listview med bilder. Det tredje alternativet er NetworkImageView, som er en slags XML erstatning for Imageview layout elementet. La oss lookat et eksempel Den første parameteren er nettadressen til bildet og den andre er lytteren for resultatet. Den tredje og fjerde parametre er heltall, maxWidth og maxHeight. Du kan sette dem til 0 for å ignorere disse parametrene. Etter det, spør ImageRequest du for ScaleType brukes til å beregne nødvendig bildestørrelse og for formatet til å dekode bitmap til. Jeg foreslår at du alltid bruker Bitmap.Config.ARGB_8888. Til slutt, vi passerer i en feil lytteren. Merk at Volley setter prioritet av denne forespørsel til LOW automatisk. Bytte fra en GET-forespørsel til en POST-forespørsel er enkel. Du må endre Request.Method i theconstructor av anmodningen og overstyre getParams metoden, tilbake aproper Kart < String, String > inneholder parametrene av forespørselen Hvis du vil avbryte alle dine forespørsler, legge til følgende kodebiten til onStop metode: POST og PUT forespørsler, men bør fortsette, selv etter at brukeren endrer aktiviteter. Vi kan oppnå dette ved å bruke tagger. Ved bygging av en GET-forespørsel, legge til en kode til den Hvis du vil avbryte alle ventende GET forespørsel, vi bare legge den følgende kodelinje: Denne måten, du bare avbryte GET-forespørsler, slik andre forespørsler urørt. Legg merke til at du nå må håndtere saken der aktiviteten er ødelagt tidlig manuelt. Volley gir ikke en metode for å sette cookies av en anmodning, eller dets prioritet. Det vil sannsynligvis i fremtiden, siden det er en alvorlig unnlatelse. For tiden, men har du å forlenge Request klassen For å håndtere cookies, kan du spille med hodene av anmodningen, overstyrer getHeaders metode. Med denne gjennomføringen, du kan direkte gi listen over cookies til forespørselen bruker setCookies. For prioritet, må du også utvide Request klasse, overstyrer getPriority metoden. Dette er hva gjennomføringen kunne se slik ut: Så, på hovedtråden, påberope denne linjen med kode for å angi prioritet av forespørselen: Du kan velge fra en av fire mulige satsingsland som vist nedenfor: I denne artikkelen har vi sett på hvordan Volley nettverk bibliotek fungerer. Vi først så hvorfor og når det er bedre å bruke Volley i stedet for en annen løsning som allerede er inkludert i Android SDK. Vi dykket dypt inn i bibliotekets detaljer, se på sin arbeidsflyt og de støttede forespørselstyper. Til slutt, vi fikk våre hender skitne ved å lage enkle forespørsler og gjennomføre tilpasset seg for håndtering av informasjonskapsler og prioritering. I neste del av denne serien om Volley, vil vi lage et enkelt program som utnytter Volley. Jeg skal vise deg hvordan du lager en vær søknad om Mars, ved hjelp av værdata som er samlet inn på Mars ved Curiosity rover.
de tidligere samtaler det gjorde og håndterer theactivity ødeleggelse og gjenoppbygging. Den bufrer alt uten at du trenger å bekymre deg for det.
Små Metadata Operations
for små samtaler, slik som JSON objekter, deler av lister, detaljer om et valgte elementet, og så videre. Det har blitt utviklet for RESTful programmer og i dette tilfellet gir det sitt aller beste.
2. Under panseret
Hoved Tråd
Cache og Network Tråder
3. Komme i gang
Trinn 1: Importere Volley
git clone https://android.googlesource.com/platform/frameworks/volley
, det vil si ved å importere thesource som en modul. I AndroidStudio, med prosjektet åpnes, velger du Fil > Ny modul, og velg ImportExisting Project. Velg katalogen hvor du har nettopp lastet ned kildekoden og bekreft. En mappe med navnet Volley vil dukke opp i prosjektstrukturen. Android Studio automatisk oppdaterer din settings.gradle fil å inkludere Volleymodule så du trenger bare å legge til avhengig kompilere prosjektet (': volley'). Og du er ferdig
kompilere 'com.mcxiaoke.volley: bibliotek-aar: 1.0.15'
Maven repository, ingen garantier og ikke støttet av Google.
Trinn 2:. Bruke Volley
Volley. String url = "http://httpbin.org/html";//Be om en streng responseStringRequest stringRequest = new StringRequest (Request.Method.GET, url, ny Response.Listener < String > () {Override public void onResponse (String respons) {//Resultat håndtering System.out.println (response.substring (0100));}}, ny Response.ErrorListener () {Override public void onErrorResponse (VolleyError feil) {//Feilhåndtering System.out.println ("Noe gikk galt!"); error.printStackTrace ();}}); //Legg forespørselen til queueVolley.newRequestQueue (denne). legge (stringRequest);
bedre på å bruke en felles anmodning kø og bruke den på tvers av prosjektet:..
MySingletonClass.getInstance () getRequestQueue () ADD (myRequest);
4. Legg hendene i Dough
Håndtering Standard Requests
StringRequest
ImageRequest
JsonRequest
String url = "http://httpbin.org/get?site=code&network=tutsplus";JsonObjectRequest jsonRequest = new JsonObjectRequest (Request.Method.GET, url, null, ny Response.Listener < JSONObject > () {Override public void onResponse (JSONObject respons) {//responsen er allerede konstruert som en JSONObject prøve {respons = response.getJSONObject ("args");! String site = response.getString ("site"), nettverks = response.getString ("nettverk"); System.out.println ("Site:" + side + "\\ nNetwork:" + nettverk);} catch (JSONException e) {e.printStackTrace ();}}}, ny Response.ErrorListener () {Override public void onErrorResponse (VolleyError feil) {error.printStackTrace ();}}); Volley.newRequestQueue (denne) .Legg (jsonRequest);
. String url = "http://i.imgur.com/Nwk25LA.jpg "; mImageView = (Imageview) findViewById (R.id.image); ImageRequest imgRequest = new ImageRequest (url, ny Response.Listener < Bitmap > () {Override public void onResponse (Bitmap respons) {mImageView.setImageBitmap (respons);}}, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, ny Response.ErrorListener () {Override public void onErrorResponse (VolleyError feil) {mImageView.setBackgroundColor (Color.parseColor ("# FF0000") ); error.printStackTrace ();}}); Volley.newRequestQueue (denne) .Legg (imgRequest);
//Snippet tatt fra ImageRequest.java, //i Volley kildekoden @ Overridepublic Priority getPriority () {return Priority.LOW;}
Å gjøre en POST Request
String url = "http://httpbin.org/post";StringRequest postRequest = new StringRequest (Request.Method.POST, url, ny Response.Listener. < String > () {@ styre public void onResponse (String respons) {try {JSONObject jsonResponse = new JSONObject (respons) .getJSONObject ("form"); String site = jsonResponse.getString ("site"), nettverks = jsonResponse.getString ("nettverk"); System.out.println ("Site:" + side + "\\ nNetwork:" + nettverk);} catch (JSONException e) {e.printStackTrace ();}}}, ny Response.ErrorListener () {Override public void onErrorResponse (VolleyError feil) {error.printStackTrace ();}}) {Override beskyttet Kart < String, String > getParams () {Kart < String, String > params = new HashMap < > (); //The Post parametere: params.put ("site", "code"); params.put ("nettverk", "tutsplus"); returnere params; }}; Volley.newRequestQueue (denne) .Legg (postRequest);
Avbryte en Request
@ Overrideprotected void onStop () {super.onStop (); mRequestQueue.cancelAll (ny RequestQueue.RequestFilter () {Override public boolean gjelder (Request < > forespørsel) {//må jeg avbryte denne return true;? //- > alltid ja}});} < p> På denne måten trenger du ikke å bekymre deg om muligheten for at brukeren allerede har ødelagt aktiviteten når onResponse kalles. En NullPointerException ville bli kastet i et slikt tilfelle.
//etter å erklære din requestrequest.setTag ("GET");. MRequestQueue.add (forespørsel);
mRequestQueue.cancelAll ("GET");
Behandle Cookies og Request Priority
Public class CustomRequest strekker JsonObjectRequest {//Siden vi utvide en Request klasse //vi bare bruke sin konstruktør offentlig CustomRequest (int metode, String url, JSONObject jsonRequest, Response.Listener < JSONObject > lytteren, Response.ErrorListener errorListener) {super (metode, url, jsonRequest, lytteren, errorListener); } Private Kart < String, String > headers = new HashMap < > (); /** * Custom klasse! * /Public void setCookies (List < String > cookies) {Stringbuilder sb = new Stringbuilder (); for (String cookie: cookies) {sb.append (cookie) .append (";"); } Headers.put ("Cookie", sb.toString ()); }Override Offentlig Kart < String, String > getHeaders () kaster AuthFailureError {return overskrifter; }}
//Først oppretter du en liste over de cookies, //dannet HTTP konvensjoner //dvs. key = valueList < String > cookies = new Arraylist < > (); cookies.add ("site = code"); cookies.add ("nettverk = tutsplus"); //så du påberope tilpassede methodcustomRequest.setCookies (informasjonskapsler); //og til slutt legge forespørselen til queueVolley.newRequestQueue (denne) .Legg (customRequest);
Priority mPriority; public void setPriority (Priority prioritet) {mPriority = prioritet;} @ Overridepublic Priority getPriority () {//Hvis du ikke bruker setPriority metoden, //den prioritet er automatisk satt til normal avkastning mPriority! = null? mPriority: Priority.NORMAL;}
customRequest.setPriority (Priority.HIGH);
Priority.LOW //bilder, miniatyrer, ... Priority.NORMAL //residualPriority.HIGH //beskrivelser, lister, ... Priority.IMMEDIATE //pålogging, avlogging, ...
Konklusjon