Loopj er et Android-bibliotek for å lage asynkrone HTTP-forespørsler. Jeg liker det for enkel bruk og enkelhet. Opprettet av James Smith, er den også kjent som "Android Asynchronous HTTP Client", og den brukes av selskaper som Instagram, Pinterest, og mange andre. Det er et godt inngangspunkt for verden av HTTP-biblioteker, og vil hjelpe deg å forstå viktige konsepter veldig enkelt.
For å lære å bruke dette biblioteket, skal vi lage MovieTrivia, en enkel app som kobler til en webtjeneste for å hente informasjon om filmer eller TV-programmer og viser denne informasjonen til brukeren.
For å starte, opprett et nytt Android Studio-prosjekt, med en tom aktivitet. For å inkludere Loopj, kopier avhengigheten fra den offisielle nettsiden. Du kan finne avhengigheten under delen "Installasjon og grunnleggende bruk" på nettstedet (eller bare kopiere strengen nedenfor).
kompilere 'com.loopj.android:android-async-http:1.4.9'
Meldingen "Synkroniser nå" vil dukke opp i øvre høyre hjørne. Klikk på det slik at Gradle laster ned biblioteket og gjør det tilgjengelig for prosjektet ditt.
Fordi appen skal koble til Internett, må vi erklære den nødvendige tillatelsen for brukeren å autorisere. Åpne din AndroidManifest.xml
fil og, like før applikasjon
tag, skriv:
Nå er du klar til å begynne å bruke Loopj i appen din.
Vi skal lage det enkleste mulige brukergrensesnittet: bare en Tekstfelt
for å skrive inn et søkeord, a Knapp
å gjøre søket, og a TextView
for å vise resultatene. Åpen activity_mail.xml
og legg til de nødvendige brukergrensesnittkomponentene som vist nedenfor.
Nå, som vanlig, skru opp disse komponentene i din MainActivity.java
.
offentlig klasse MainActivity utvider AppCompatActivity implementerer View.OnClickListener EditText etSearchTerms; Knapp btnSearch; TextView tvSearchResults; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); etSearchTerms = (EditText) findViewById (R.id.etSearchTerms); btnSearch = (Button) findViewById (R.id.btnSearch); tvSearchResults = (TextView) findViewById (R.id.tvSearchResults); btnSearch.setOnClickListener (this); @Override public void onClick (Vis v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // gjør Loopj HTTP-samtale
For å holde koden ren og organisert, opprett en egen jaklasse, MyLoopjTask.java
, å inneholde all Loopj-spesifikk kode og operasjoner. Du trenger to instansvariabler, en av typen RequestParams
å bygge søkedetaljer inn i nettadressen, og en annen type AsyncHttpClient
å faktisk lage HTTP-forespørslene. Før du går videre, må du kontrollere at Android Studio har lagt til denne nødvendige importen.
importer org.json.JSONObject; importer cz.msebera.android.httpclient.Header;
Lag også en metode som tar brukernavnet som et argument - dette er hvor det faktiske arbeidet vil bli gjort.
offentlig klasse MyLoopjTask privat statisk endelig streng TAG = "MOVIE_TRIVIA"; AsyncHttpClient asyncHttpClient; RequestParams requestParams; String BASE_URL = "http://www.omdbapi.com/?"; String jsonResponse; offentlig MyLoopjTask () asyncHttpClient = ny AsyncHttpClient (); requestParams = new RequestParams (); public void executeLoopjCall (String queryTerm) requestParams.put ("s", queryTerm); asyncHttpClient.get (BASE_URL, requestParams, ny JsonHttpResponseHandler () @Override public void onSuccess (int statusCode, Header [] headers, JSONObject respons) super.onSuccess (statusKode, overskrifter, svar); jsonResponse = response.toString (); Log.i (TAG, "onSuccess:" + jsonResponse); @Override public void onFailure (int statusCode, Header [] headers, Kastbar kaste, JSONObject errorResponse) super.onFailure (statusKode, overskrifter, kasterbare, feilResponse); Log .e (TAG, "onFailure:" + errorResponse););
Som du ser, kan du legge til alle nødvendige API-forespørselsparameternøkler med RequestParams
forekomst (i dette tilfellet bare spørringen som er oppgitt av brukeren). Denne versjonen av få()
metode returnerer et JSON objekt til onSuccess
, men det finnes andre variasjoner som passer til dine behov. (Bruk Ctrl + O
for å se de andre versjonene av denne metoden.)
Dette er alt du trenger å gjøre for å implementere en Loopj-klient for å gjøre HTTP-anrop til en webtjeneste. I vårt tilfelle ønsker vi å sende vår forespørsel når brukeren klikker på "Søk" -knappen. Så tilbake i Hoved aktivitet
, opprett en forekomst av MyLoopjTask
og innvendig ved trykk
anrop executeLoopjCall
med begrepet angitt av brukeren. Hoved aktivitet
vil se slik ut.
offentlig klasse MainActivity utvider AppCompatActivity implementerer View.OnClickListener EditText etSearchTerms; Knapp btnSearch; TextView tvSearchResults; MyLoopjTask myLoopjTask; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); etSearchTerms = (EditText) findViewById (R.id.etSearchTerms); btnSearch = (Button) findViewById (R.id.btnSearch); tvSearchResults = (TextView) findViewById (R.id.tvSearchResults); btnSearch.setOnClickListener (this); myLoopjTask = ny MyLoopjTask (); @Override public void onClick (Vis v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // gjør loopj http call myLoopjTask.executeLoopjCall (searchTerm);
Nå, hvis du kjører appen, bør du se resultatene av forespørselen din i loggvinduet.
Å skille asynkron operasjoner til dedikerte klasser bidrar til å holde koden ren, men det betyr at vi ikke har tilgang til UI-elementer direkte. For å vise resultatene av disse forespørsler, anbefaler jeg at du oppretter et lyttergrensesnitt. Dette er en felles strategi, diskutert for eksempel i dette Stack Overflow-spørsmålet. Den har tre enkle trinn.
Først opprett et grensesnitt med en enkelt metode som vil bli kalt når resultatene av HTTP-forespørselen oppnås fra Loopj.
offentlig grensesnitt OnLoopjCompleted public void taskCompleted (Stringresultater);
I MyLoopjTask
, modifiser konstruktøren slik at det tar en Kontekst
og en OnLoopjCompleted
forekomst som parametere.
offentlig MyLoopjTask (Kontekst kontekst, OnLoopjCompleted lytter) asyncHttpClient = ny AsyncHttpClient (); requestParams = new RequestParams (); this.context = context; this.loopjListener = lytter;
Nå, når forespørselsresultatene er tilgjengelige i MyLoopjTask
, send dem til lyttergrensesnittets metode.
@Override public void onSuccess (int statusCode, Header [] headers, JSONObject respons) super.onSuccess (statusKode, overskrifter, svar); jsonResponse = response.toString (); loopjListener.taskCompleted (jsonResponse); Log.i (TAG, "onSuccess:" + jsonResponse);
Til slutt, gjør aktiviteten du vil oppdatere, i dette tilfellet Hoved aktivitet
-implementere OnLoopjCompleted
. Oppdater initialiseringen av myLoopjTask
til myLoopjTask = ny MyLoopjTask (dette, dette);
.
Siden aktiviteten din nå utfører OnLoopjCompleted
, Android Studio vil tvinge deg til å implementere metoden taskCompleted
. Der kan du oppdatere brukergrensesnittet med de nye dataene.
@Override public void taskCompleted (Stringresultater) tvSearchResults.setText (results);
Der har du det. Når du kjører appen, blir alle dataene fra din asynkrone HTTP-forespørsel vist til brukeren. Naturligvis vil du ønske å analysere de mottatte JSON-dataene for å trekke ut bare de delene du trenger. For eksempel kan du vise filmen plakaten ved å sende plakat bilde URL til Picasso.
I denne opplæringen har du sett hvordan du bruker Loopj, et bibliotek for å utføre asynkrone HTTP-forespørsler i Android. Loopj er lett å bruke med bare noen få linjer med kode. Nå har du ingen unnskyldning for ikke å holde appen din oppdatert med innhold fra din favorittwebtjeneste!