Loopj este o bibliotecă Android pentru efectuarea de solicitări asincrone HTTP. Îmi place pentru ușurința de utilizare și simplitate. Creat de James Smith, este, de asemenea, cunoscut sub numele de "client asincron HTTP Android" și este folosit de companii precum Instagram, Pinterest și multe altele. Este un punct bun de intrare în lumea bibliotecilor HTTP și vă va ajuta să înțelegeți foarte ușor conceptele importante.
Pentru a învăța să folosim această bibliotecă, vom crea MovieTrivia, o aplicație simplă care se conectează la un serviciu web pentru a prelua informații despre filme sau emisiuni TV și le va afișa utilizatorului.
Pentru a începe, creați un nou proiect Android Studio, cu o activitate goală. Pentru a include Loopj, copiați dependența de pe site-ul oficial. Puteți găsi dependența din secțiunea "Instalare și utilizare de bază" a site-ului (sau copiați șirul de mai jos).
compile 'com.loopj.android:android-async-http:1.4.9'
Mesajul "Sync Now" va apărea în colțul din dreapta sus. Faceți clic pe acesta astfel încât Gradle să descarce biblioteca și să o pună la dispoziția proiectului.
Deoarece aplicația se va conecta la internet, trebuie să declare permisiunea corespunzătoare pentru ca utilizatorul să o autorizeze. Deschide-ți AndroidManifest.xml
dosar și, chiar înainte de cerere
eticheta, scrie:
Acum sunteți gata să începeți să utilizați Loopj în aplicația dvs..
Vom crea cea mai simplă interfață de utilizator posibilă: doar a TextField
pentru a introduce un termen de căutare, a Buton
pentru a face căutarea și a TextView
pentru a afișa rezultatele. Deschis activity_mail.xml
și adăugați componentele UI necesare, după cum se arată mai jos.
Acum, ca de obicei, conduceți aceste componente în dvs. MainActivity.java
.
public class MainActivity se extinde AppCompatActivity implementează View.OnClickListener EditText etSearchTerms; Buton btnSearch; TextView tvSearchResults; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); etSearchTerms = (EditText) findViewById (R.id.etSearchTerms); btnSearch = (buton) findViewById (R.id.btnSearch); tvSearchResults = (TextView) findViewById (R.id.tvSearchResults); btnSearch.setOnClickListener (aceasta); @Override public void onClick (Vizualizare v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // a face apelul la HTTP Loopj
Pentru a vă păstra codul curat și organizat, creați o clasă java separată, MyLoopjTask.java
, să conțină toate codurile și operațiunile specifice lui Loopj. Veți avea nevoie de două variabile de instanță, una de tip RequestParams
pentru a construi detaliile de căutare în URL-ul și altul de tip AsyncHttpClient
să faceți efectiv cererile HTTP. Înainte de a merge mai departe, verificați dacă Android Studio a adăugat aceste importuri necesare.
import org.json.JSONObject; import cz.msebera.android.httpclient.Header;
Creați, de asemenea, o metodă care ia interogarea utilizatorului ca argument - aici se va realiza lucrarea reală.
clasa publica MyLoopjTask privat static final String TAG = "MOVIE_TRIVIA"; AsyncHttpClient asyncHttpClient; SolicitareParamântare cerereParame; String BASE_URL = "http://www.omdbapi.com/?"; Stringul jsonResponse; public MyLoopjTask () asyncHttpClient = nou AsyncHttpClient (); requestParams = noi RequestParams (); void public executeLoopjCall (interogare String) requestParams.put ("s", queryTerm); asyncHttpClient.get (BASE_URL, requestParams, noul JsonHttpResponseHandler () @Override public void onSuccess (int statusCode, Header [] anteturi, răspuns JSONObject) super.onSuccess (statusCode, anteturi, răspuns) jsonResponse = response.toString; Log.i (TAG, "onSuccess:" + jsonResponse); @Override public void onFailure (int statusCode, antet Header [], Throwable throwable, JSONObject errorResponse) super.onFailure (statusCode, headers, throwable, errorResponse) .e (TAG, "onFailure:" + errorResponse););
După cum vedeți, puteți adăuga toate tastele parametrilor de solicitare API necesari RequestParams
(în acest caz, doar interogarea introdusă de utilizator). Această versiune a obține()
metoda returnează un obiect JSON onSuccess
, dar există alte variații disponibile pentru a se potrivi nevoilor dvs. (Utilizare Ctrl + O
pentru a vedea celelalte versiuni ale acestei metode.)
Acesta este tot ce trebuie să faceți pentru a implementa un client Loopj pentru a efectua apeluri HTTP către un serviciu web. În cazul nostru, dorim să trimitem solicitarea noastră atunci când utilizatorul face clic pe butonul "Căutare". Deci, înapoi Activitate principala
, creați un exemplu de MyLoopjTask
și înăuntru onClick
apel executeLoopjCall
cu termenul introdus de utilizator. Activitate principala
va arata dupa cum urmeaza.
public class MainActivity se extinde AppCompatActivity implementează View.OnClickListener EditText etSearchTerms; Buton btnSearch; TextView tvSearchResults; MyLoopjTask myLoopjTask; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); etSearchTerms = (EditText) findViewById (R.id.etSearchTerms); btnSearch = (buton) findViewById (R.id.btnSearch); tvSearchResults = (TextView) findViewById (R.id.tvSearchResults); btnSearch.setOnClickListener (aceasta); myLoopjTask = noul MyLoopjTask (); @Override public void onClick (Vizualizare v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // a face apelul http la apelul myLoopjTask.executeLoopjCall (searchTerm);
Acum, dacă rulați aplicația, ar trebui să vedeți rezultatele solicitării în fereastra de jurnalizare.
Separarea operațiilor asincrone în clase dedicate ne ajută să păstrăm codul curat, dar înseamnă că nu avem acces direct la elementele UI. Pentru a arăta rezultatele acestor solicitări, vă recomand să creați o interfață de ascultător. Aceasta este o strategie comună, discutată, de exemplu, în această întrebare privind depășirea stivei. Are trei pași simpli.
Mai întâi, creați o interfață cu o singură metodă care va fi apelată atunci când rezultatele cererii HTTP sunt obținute de la Loopj.
interfață publică OnLoopjCompleted public void taskCompleted (rezultate String);
În MyLoopjTask
, modificați constructorul astfel încât acesta să fie necesar Context
si un OnLoopjCompleted
ca parametri.
public MyLoopjTask (context de context, ascultător OnLoopjCompleted) asyncHttpClient = new AsyncHttpClient (); requestParams = noi RequestParams (); this.context = context; this.loopjListener = ascultător;
Acum, când rezultatele cererii sunt disponibile în MyLoopjTask
, treceți-le la metoda interfeței ascultătorului.
@Override public void onSuccess (int statusCode, Header [] anteturi, răspuns JSONObject) super.onSuccess (statusCode, anteturi, răspuns); jsonResponse = răspuns.toString (); loopjListener.taskCompleted (jsonResponse); Log.i (TAG, "onSuccess:" + jsonResponse);
În cele din urmă, faceți activitatea pe care doriți să o actualizați - în acest caz Activitate principala
-aplica OnLoopjCompleted
. Actualizați inițializarea myLoopjTask
la myLoopjTask = noua MyLoopjTask (aceasta, aceasta);
.
Deoarece activitatea dvs. este acum implementată OnLoopjCompleted
, Android Studio vă va obliga să implementați metoda taskCompleted
. Acolo, puteți actualiza interfața cu datele noi.
@Override public void taskCompleted (rezultate String) tvSearchResults.setText (rezultate);
Acolo îl aveți. Când executați aplicația, toate datele din solicitarea dvs. HTTP asincronă vor fi afișate utilizatorului. Firește, veți dori să analizați datele JSON primite pentru a extrage doar părțile de care aveți nevoie. De exemplu, puteți afișa posterul filmului trecând adresa URL a imaginii posterului la Picasso.
În acest tutorial, ați văzut cum să utilizați Loopj, o bibliotecă pentru a efectua solicitări HTIN asincrone în Android. Loopj este ușor de folosit cu doar câteva linii de cod. Acum nu aveți nici o scuză pentru a nu ține aplicația actualizată cu conținutul serviciului web preferat!