Ci sono già molte grandi risposte su questa domanda, ma molte grandi biblioteche sono uscite da quando queste risposte sono state pubblicate. Questo è inteso come una specie di guida per principianti.
Tratterò diversi casi d'uso per eseguire operazioni di rete e una soluzione o due per ciascuno.
ReST su HTTP
Tipicamente Json, può essere XML o qualcos'altro
Accesso API completo
Supponiamo che tu stia scrivendo un'app che consente agli utenti di tenere traccia dei prezzi delle azioni, dei tassi di interesse e dei tassi di cambio. Trovi un'API Json simile a questa:
http://api.example.com/stocks //ResponseWrapper<String> object containing a list of Srings with ticker symbols
http://api.example.com/stocks/$symbol //Stock object
http://api.example.com/stocks/$symbol/prices //PriceHistory<Stock> object
http://api.example.com/currencies //ResponseWrapper<String> object containing a list of currency abbreviation
http://api.example.com/currencies/$currency //Currency object
http://api.example.com/currencies/$id1/values/$id2 //PriceHistory<Currency> object comparing the prices of the first currency (id1) to the second (id2)
Retrofit da Square
Questa è una scelta eccellente per un'API con più endpoint e consente di dichiarare gli endpoint ReST invece di doverli codificare singolarmente come con altre librerie come ion o Volley. (sito web: http://square.github.io/retrofit/ )
Come lo usi con l'API delle finanze?
build.gradle
Aggiungi queste righe al tuo buid.gradle a livello di modulo:
implementation 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit library, current as of September 21, 2017
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //gson serialization and deserialization support for retrofit, version must match retrofit version
FinancesApi.java
public interface FinancesApi {
@GET("stocks")
Call<ResponseWrapper<String>> listStocks();
@GET("stocks/{symbol}")
Call<Stock> getStock(@Path("symbol")String tickerSymbol);
@GET("stocks/{symbol}/prices")
Call<PriceHistory<Stock>> getPriceHistory(@Path("symbol")String tickerSymbol);
@GET("currencies")
Call<ResponseWrapper<String>> listCurrencies();
@GET("currencies/{symbol}")
Call<Currency> getCurrency(@Path("symbol")String currencySymbol);
@GET("currencies/{symbol}/values/{compare_symbol}")
Call<PriceHistory<Currency>> getComparativeHistory(@Path("symbol")String currency, @Path("compare_symbol")String currencyToPriceAgainst);
}
FinancesApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
Finanze Frammento di frammento
FinancesApi api = FinancesApiBuilder.build("http://api.example.com/"); //trailing '/' required for predictable behavior
api.getStock("INTC").enqueue(new Callback<Stock>(){
@Override
public void onResponse(Call<Stock> stockCall, Response<Stock> stockResponse){
Stock stock = stockCall.body();
//do something with the stock
}
@Override
public void onResponse(Call<Stock> stockCall, Throwable t){
//something bad happened
}
}
Se la tua API richiede l'invio di una chiave API o altra intestazione come un token utente, ecc., Retrofit rende tutto più semplice (vedi questa fantastica risposta per i dettagli: https://stackoverflow.com/a/42899766/1024412 ).
Accesso API ReST unico
Supponiamo che tu stia costruendo un'app "maltempo" che cerca la posizione GPS degli utenti e controlla la temperatura corrente in quella zona e dice loro l'umore. Questo tipo di app non deve dichiarare endpoint API; deve solo essere in grado di accedere a un endpoint API.
ione
Questa è un'ottima libreria per questo tipo di accesso.
Si prega di leggere la grande risposta di msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Carica immagini tramite HTTP
raffica
Volley può essere utilizzato anche per le API ReST, ma a causa della configurazione più complicata richiesta preferisco usare Retrofit da Square come sopra ( http://square.github.io/retrofit/ )
Supponiamo che tu stia creando un'app di social network e desideri caricare le foto del profilo degli amici.
build.gradle
Aggiungi questa riga al tuo buid.gradle a livello di modulo:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Volley richiede più impostazioni rispetto a Retrofit. Dovrai creare una classe come questa per impostare RequestQueue, ImageLoader e ImageCache, ma non è poi così male:
public class ImageFetch {
private static ImageLoader imageLoader = null;
private static RequestQueue imageQueue = null;
public static ImageLoader getImageLoader(Context ctx){
if(imageLoader == null){
if(imageQueue == null){
imageQueue = Volley.newRequestQueue(ctx.getApplicationContext());
}
imageLoader = new ImageLoader(imageQueue, new ImageLoader.ImageCache() {
Map<String, Bitmap> cache = new HashMap<String, Bitmap>();
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
return imageLoader;
}
}
user_view_dialog.xml
Aggiungi quanto segue al tuo file xml di layout per aggiungere un'immagine:
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/profile_picture"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
app:srcCompat="@android:drawable/spinner_background"/>
UserViewDialog.java
Aggiungi il seguente codice al metodo onCreate (Frammento, Attività) o al costruttore (Finestra di dialogo):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Un'altra eccellente biblioteca di Square. Si prega di consultare il sito per alcuni grandi esempi: http://square.github.io/picasso/