Loopj è una libreria Android per effettuare richieste HTTP asincrone. Mi piace per la sua facilità d'uso e semplicità. Creato da James Smith, è anche conosciuto come "Android Asynchronous HTTP Client" ed è utilizzato da aziende come Instagram, Pinterest e molti altri. È un buon punto di partenza per il mondo delle librerie HTTP e ti aiuterà a capire concetti importanti molto facilmente.
Per imparare a usare questa libreria, creeremo MovieTrivia, una semplice app che si collega a un servizio web per recuperare informazioni su film o programmi TV e mostra queste informazioni all'utente.
Per iniziare, crea un nuovo progetto Android Studio, con un'attività vuota. Per includere Loopj, copia la dipendenza dal sito web ufficiale. Puoi trovare la dipendenza nella sezione "Installazione e utilizzo di base" del sito web (o semplicemente copiare la stringa sotto).
compila 'com.loopj.android:android-async-http:1.4.9'
Il messaggio "Sync Now" apparirà nell'angolo in alto a destra. Fare clic in modo che Gradle scaricherà la libreria e la renderà disponibile per il progetto.
Poiché l'app si collegherà a Internet, è necessario dichiarare l'autorizzazione appropriata che l'utente può autorizzare. Apri i tuoi AndroidManifest.xml
file e, poco prima del applicazione
tag, scrivi:
Ora sei pronto per iniziare ad usare Loopj nella tua app.
Creeremo l'interfaccia utente più semplice possibile: solo a Campo di testo
per inserire un termine di ricerca, a Pulsante
fare la ricerca e a TextView
per mostrare i risultati. Aperto activity_mail.xml
e aggiungere i componenti UI richiesti come mostrato di seguito.
Ora, come al solito, cablate questi componenti nel vostro MainActivity.java
.
public class MainActivity estende AppCompatActivity implementa View.OnClickListener EditText etSearchTerms; Button 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 (questo); @Override public void onClick (Visualizza v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // effettua la chiamata HTTP Loopj
Per mantenere il tuo codice pulito e organizzato, crea una classe java separata, MyLoopjTask.java
, per contenere tutto il codice e le operazioni specifici di Loopj. Avrai bisogno di due variabili di istanza, una di tipo RequestParams
per costruire i dettagli della ricerca nell'URL e un altro di tipo AsyncHttpClient
per fare effettivamente le richieste HTTP. Prima di andare oltre, controlla che Android Studio abbia aggiunto queste importazioni necessarie.
import org.json.JSONObject; import cz.msebera.android.httpclient.Header;
Crea anche un metodo che consideri la query dell'utente come un argomento: qui è dove verrà svolto il lavoro effettivo.
public class MyLoopjTask private static final String TAG = "MOVIE_TRIVIA"; AsyncHttpClient asyncHttpClient; RequestParams requestParams; String BASE_URL = "http://www.omdbapi.com/?"; String jsonResponse; public MyLoopjTask () asyncHttpClient = new AsyncHttpClient (); requestParams = new RequestParams (); public void executeLoopjCall (String queryTerm) requestParams.put ("s", queryTerm); asyncHttpClient.get (BASE_URL, requestParams, new JsonHttpResponseHandler () @Override onSuccess pubblico (int statusCode, intestazione Header [], risposta JSONObject) super.onSuccess (statusCode, intestazioni, risposta); jsonResponse = response.toString (); Log.i (TAG, "onSuccess:" + jsonResponse); @Override public void onFailure (int statusCode, Header [] headers, Throwable throwable, JSONObject errorResponse) super.onFailure (statusCode, headers, throwable, errorResponse); Log .e (TAG, "onFailure:" + errorResponse););
Come puoi vedere, puoi aggiungere tutte le chiavi dei parametri di richiesta API necessarie con RequestParams
istanza (in questo caso, solo la query inserita dall'utente). Questa versione del ottenere()
metodo restituisce un oggetto JSON a onSuccess
, ma ci sono altre varianti disponibili per soddisfare le tue esigenze. (Uso Ctrl + O
per vedere le altre versioni di questo metodo.)
Questo è tutto ciò che devi fare per implementare un client Loopj per effettuare chiamate HTTP a un servizio web. Nel nostro caso, vogliamo inviare la nostra richiesta quando l'utente fa clic sul pulsante "Cerca". Quindi, di nuovo Attività principale
, creare un'istanza di MyLoopjTask
e dentro al clic
chiamata executeLoopjCall
con il termine inserito dall'utente. Attività principale
apparirà come segue.
public class MainActivity estende AppCompatActivity implementa View.OnClickListener EditText etSearchTerms; Button 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 (questo); myLoopjTask = new MyLoopjTask (); @Override public void onClick (Visualizza v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // make loopj http call myLoopjTask.executeLoopjCall (searchTerm);
Ora, se esegui l'app, dovresti vedere i risultati della tua richiesta nella finestra del registro.
Separare le operazioni asincrone in classi dedicate aiuta a mantenere pulito il nostro codice, ma significa che non abbiamo accesso diretto agli elementi dell'interfaccia utente. Per mostrare i risultati di queste richieste, consiglio di creare un'interfaccia listener. Questa è una strategia comune, discussa ad esempio in questa domanda sull'overflow dello stack. Ha tre semplici passaggi.
Innanzitutto, crea un'interfaccia con un singolo metodo che verrà chiamato quando i risultati della richiesta HTTP vengono ottenuti da Loopj.
interfaccia pubblica OnLoopjCompleted public void taskCompleted (String results);
Nel MyLoopjTask
, modificare il costruttore in modo che richieda a Contesto
e un OnLoopjCompleted
istanza come parametri.
public MyLoopjTask (Context context, OnLoopjCompleted listener) asyncHttpClient = new AsyncHttpClient (); requestParams = new RequestParams (); this.context = context; this.loopjListener = listener;
Ora, quando i risultati della richiesta sono disponibili in MyLoopjTask
, passali al metodo dell'interfaccia listener.
@Override public void onSuccess (int statusCode, intestazione Header [], risposta JSONObject) super.onSuccess (statusCode, intestazioni, risposta); jsonResponse = response.toString (); loopjListener.taskCompleted (jsonResponse); Log.i (TAG, "onSuccess:" + jsonResponse);
Infine, imposta l'attività che desideri aggiornare, in questo caso Attività principale
-strumento OnLoopjCompleted
. Aggiorna l'inizializzazione di myLoopjTask
a myLoopjTask = new MyLoopjTask (this, this);
.
Poiché la tua attività ora implementa OnLoopjCompleted
, Android Studio ti costringerà a implementare il metodo taskCompleted
. Lì, puoi aggiornare l'interfaccia utente con i nuovi dati.
@Override public void taskCompleted (String results) tvSearchResults.setText (risultati);
Ecco qua. Quando si esegue l'applicazione, tutti i dati dalla richiesta HTTP asincrona verranno visualizzati all'utente. Ovviamente, vorrai analizzare i dati JSON ricevuti per estrarre solo le parti di cui hai bisogno. Ad esempio, è possibile visualizzare il poster del film passando l'URL dell'immagine del poster su Picasso.
In questo tutorial, hai visto come usare Loopj, una libreria per eseguire richieste HTTP asincrone in Android. Loopj è facile da usare con poche righe di codice. Ora non hai alcuna scusa per non tenere aggiornata la tua app con i contenuti del tuo servizio web preferito!