Ya hay muchas respuestas excelentes sobre esta pregunta, pero han surgido muchas bibliotecas excelentes desde que se publicaron esas respuestas. Esto pretende ser una especie de guía para novatos.
Cubriré varios casos de uso para realizar operaciones de red y una solución o dos para cada uno.
ReST sobre HTTP
Típicamente Json, puede ser XML u otra cosa
Acceso completo a la API
Supongamos que está escribiendo una aplicación que permite a los usuarios rastrear los precios de las acciones, las tasas de interés y los tipos de cambio actuales. Encuentra una API de Json que se parece a esto:
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 de Square
Esta es una excelente opción para una API con múltiples puntos finales y le permite declarar los puntos finales ReST en lugar de tener que codificarlos individualmente como con otras bibliotecas como ion o Volley. (sitio web: http://square.github.io/retrofit/ )
¿Cómo se usa con la API de finanzas?
build.gradle
Agregue estas líneas a su nivel de módulo buid.gradle:
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);
}
}
Fragmento de fragmentos de finanzas
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
}
}
Si su API requiere que se envíe una clave API u otro encabezado como un token de usuario, etc., Retrofit lo hace fácil (consulte esta increíble respuesta para obtener más detalles: https://stackoverflow.com/a/42899766/1024412 ).
Acceso único a la API ReST
Supongamos que está creando una aplicación de "clima meteorológico" que busca la ubicación del GPS del usuario y comprueba la temperatura actual en esa área y les informa el estado de ánimo. Este tipo de aplicación no necesita declarar puntos finales de API; solo necesita poder acceder a un punto final API.
Ion
Esta es una gran biblioteca para este tipo de acceso.
Lea la excelente respuesta de msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Cargar imágenes a través de HTTP
Voleo
Volley también se puede usar para las API de ReST, pero debido a la configuración más complicada que se requiere, prefiero usar Retrofit from Square como anteriormente ( http://square.github.io/retrofit/ )
Supongamos que está creando una aplicación de red social y desea cargar imágenes de perfil de amigos.
build.gradle
Agregue esta línea a su nivel de módulo buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Volley requiere más configuración que Retrofit. Tendrá que crear una clase como esta para configurar RequestQueue, ImageLoader y ImageCache, pero no está tan mal:
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
Agregue lo siguiente a su archivo xml de diseño para agregar una imagen:
<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
Agregue el siguiente código al método onCreate (Fragmento, Actividad) o al constructor (Diálogo):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Otra excelente biblioteca de Square. Consulte el sitio para ver algunos ejemplos excelentes: http://square.github.io/picasso/