Já existem muitas ótimas respostas para essa pergunta, mas muitas grandes bibliotecas surgiram desde que essas respostas foram postadas. Este é um tipo de guia para iniciantes.
Vou cobrir vários casos de uso para executar operações de rede e uma ou duas soluções para cada uma.
ReST sobre HTTP
Tipicamente Json, pode ser XML ou outra coisa
Acesso completo à API
Digamos que você esteja escrevendo um aplicativo que permita aos usuários acompanhar os preços das ações, taxas de juros e taxas de câmbio. Você encontra uma API Json que se parece com isso:
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 from Square
Essa é uma excelente opção para uma API com vários pontos de extremidade e permite declarar os pontos de extremidade do ReST em vez de precisar codificá-los individualmente, como acontece com outras bibliotecas como ion ou Volley. (site: http://square.github.io/retrofit/ )
Como você o usa com a API de finanças?
build.gradle
Adicione estas linhas ao seu buid.gradle no nível do módulo:
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 fragmento
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 sua API exigir que uma chave de API ou outro cabeçalho como um token de usuário etc. seja enviado, o Retrofit facilita isso (consulte esta resposta incrível para obter detalhes: https://stackoverflow.com/a/42899766/1024412 ).
Acesso único à API do ReST
Digamos que você esteja criando um aplicativo "clima ameno" que pesquise a localização do GPS do usuário e verifique a temperatura atual nessa área e informe o clima. Esse tipo de aplicativo não precisa declarar pontos de extremidade da API; ele só precisa acessar um ponto de extremidade da API.
Íon
Esta é uma ótima biblioteca para esse tipo de acesso.
Leia a excelente resposta de msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Carregar imagens via HTTP
Vôlei
O Volley também pode ser usado para APIs ReST, mas devido à configuração mais complicada necessária, eu prefiro usar o Retrofit from Square como acima ( http://square.github.io/retrofit/ )
Digamos que você esteja criando um aplicativo de rede social e deseje carregar fotos de perfil de amigos.
build.gradle
Adicione esta linha ao seu nível de módulo buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
O Volley requer mais configuração que o Retrofit. Você precisará criar uma classe como esta para configurar um RequestQueue, um ImageLoader e um ImageCache, mas não é tão ruim assim:
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
Adicione o seguinte ao arquivo xml de layout para adicionar uma imagem:
<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
Adicione o seguinte código ao método onCreate (Fragment, Activity) ou ao construtor (Dialog):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Outra excelente biblioteca da Square. Consulte o site para alguns ótimos exemplos: http://square.github.io/picasso/