Loopj is een Android-bibliotheek voor het maken van asynchrone HTTP-verzoeken. Ik vind het leuk vanwege het gebruiksgemak en de eenvoud. Het is gemaakt door James Smith en staat ook bekend als "Android Asynchronous HTTP Client" en wordt gebruikt door bedrijven zoals Instagram, Pinterest en vele anderen. Het is een goed toegangspunt tot de wereld van HTTP-bibliotheken en helpt u belangrijke concepten heel gemakkelijk te begrijpen.
Om deze bibliotheek te leren gebruiken, gaan we MovieTrivia maken, een eenvoudige app die verbinding maakt met een webservice om informatie over films of tv-programma's op te halen en deze informatie aan de gebruiker toont.
Maak om te beginnen een nieuw Android Studio-project met een lege activiteit. Als u Loopj wilt opnemen, kopieert u de afhankelijkheid van de officiële website. Je kunt de afhankelijkheid vinden onder het gedeelte "Installatie en basisgebruik" van de website (of kopieer de onderstaande string).
compileer 'com.loopj.android:android-async-http:1.4.9'
Het bericht "Nu synchroniseren" verschijnt in de rechterbovenhoek. Klik erop zodat Gradle de bibliotheek downloadt en beschikbaar maakt voor uw project.
Omdat de app verbinding met internet maakt, moeten we de juiste toestemming voor de gebruiker autoriseren om te autoriseren. Open je AndroidManifest.xml
bestand en, net voor de toepassing
tag, schrijf:
Nu bent u klaar om Loopj te gaan gebruiken in uw app.
We gaan de eenvoudigste gebruikersinterface maken: slechts een TextField
om een zoekterm in te voeren, Knop
om de zoekopdracht uit te voeren, en Tekstweergave
om de resultaten te tonen. Open activity_mail.xml
en voeg de vereiste UI-componenten toe, zoals hieronder wordt weergegeven.
Verbind nu zoals gewoonlijk deze componenten in uw MainActivity.java
.
public class MainActivity breidt AppCompatActivity implementeert View.OnClickListener EditText etSearchTerms; Knop 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 (deze); @Override public void onClick (View v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // make Loopj HTTP-oproep
Om uw code schoon en georganiseerd te houden, maakt u een aparte Java-klasse, MyLoopjTask.java
, om alle Loopj-specifieke code en bewerkingen te bevatten. U hebt twee instantievariabelen nodig, een van het type RequestParams
om de zoekdetails in de URL te bouwen en een andere van het type AsyncHttpClient
om de HTTP-verzoeken daadwerkelijk te maken. Controleer voordat u verder gaat of Android Studio deze noodzakelijke import heeft toegevoegd.
import org.json.JSONObject; import cz.msebera.android.httpclient.Header;
Maak ook een methode die de gebruikersquery als een argument beschouwt - dit is waar het daadwerkelijke werk zal worden gedaan.
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 public void onSuccess (int statusCode, Header [] headers, JSONObject-respons) super.onSuccess (statusCode, headers, response); 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););
Zoals u ziet, kunt u alle benodigde API-aanvraagparametersleutels toevoegen met de RequestParams
bijvoorbeeld (in dit geval alleen de zoekopdracht die door de gebruiker is ingevoerd). Deze versie van de krijgen()
methode retourneert een JSON-object naar onSuccess
, maar er zijn andere variaties beschikbaar om aan uw behoeften te voldoen. (Gebruik Ctrl + O
om de andere versies van deze methode te zien.)
Dit is alles wat u hoeft te doen om een Loopj-client te implementeren om HTTP-oproepen naar een webservice te maken. In ons geval willen we ons verzoek verzenden wanneer de gebruiker op de knop "Zoeken" klikt. Dus, terug in Hoofdactiviteit
, maak een instantie van MyLoopjTask
en van binnen bij klikken
telefoontje executeLoopjCall
met de door de gebruiker opgegeven term. Hoofdactiviteit
ziet er als volgt uit.
public class MainActivity breidt AppCompatActivity implementeert View.OnClickListener EditText etSearchTerms; Knop 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 (deze); myLoopjTask = new MyLoopjTask (); @Override public void onClick (View v) String searchTerm = etSearchTerms.getText (). ToString (); etSearchTerms.setText ( ""); // make loopj http call myLoopjTask.executeLoopjCall (searchTerm);
Als u de app nu uitvoert, ziet u de resultaten van uw aanvraag in het logboekvenster.
Het scheiden van asynchrone bewerkingen in speciale klassen helpt onze code schoon te houden, maar dit betekent dat we geen directe toegang hebben tot UI-elementen. Om de resultaten van deze verzoeken te tonen, raad ik aan om een luisteraarinterface te maken. Dit is een algemene strategie, die we bijvoorbeeld in deze Stack Overflow-vraag bespraken. Het heeft drie eenvoudige stappen.
Maak eerst een interface met een enkele methode die wordt aangeroepen wanneer de resultaten van het HTTP-verzoek worden verkregen van Loopj.
openbare interface OnLoopjCompleted public void taskCompleted (String results);
In MyLoopjTask
, wijzig de constructor zodat het a Context
en een OnLoopjCompleted
bijvoorbeeld als parameters.
public MyLoopjTask (Context context, OnLoopjCompleted listener) asyncHttpClient = new AsyncHttpClient (); requestParams = new RequestParams (); this.context = context; this.loopjListener = luisteraar;
Nu, wanneer de aanvraagresultaten beschikbaar zijn in MyLoopjTask
, geef ze door aan de methode van de luisteraarinterface.
@Override public void onSuccess (int statusCode, Header [] headers, JSONObject-respons) super.onSuccess (statusCode, headers, response); jsonResponse = response.toString (); loopjListener.taskCompleted (jsonResponse); Log.i (TAG, "onSuccess:" + jsonResponse);
Maak ten slotte de activiteit die u wilt bijwerken, in dit geval Hoofdactiviteit
-uitvoeren OnLoopjCompleted
. Update de initialisatie van myLoopjTask
naar myLoopjTask = new MyLoopjTask (this, this);
.
Omdat uw activiteit nu wordt geïmplementeerd OnLoopjCompleted
, Android Studio dwingt je om de methode te implementeren taak volbracht
. Daar kunt u de gebruikersinterface bijwerken met de nieuwe gegevens.
@Override public void taskCompleted (String results) tvSearchResults.setText (results);
Daar heb je het. Wanneer u de app uitvoert, worden alle gegevens van uw asynchrone HTTP-aanvraag weergegeven aan de gebruiker. Uiteraard wilt u de ontvangen JSON-gegevens ontleden om alleen de onderdelen te extraheren die u nodig hebt. U kunt bijvoorbeeld de poster van de film weergeven door de URL van de posterafbeelding naar Picasso te sturen.
In deze zelfstudie hebt u gezien hoe Loopj te gebruiken, een bibliotheek om asynchrone HTTP-aanvragen in Android uit te voeren. Loopj is eenvoudig te gebruiken met slechts een paar regels code. U hebt nu geen excuus om uw app niet up-to-date te houden met inhoud van uw favoriete webservice!