Istnieje wiele wspaniałych odpowiedzi na to pytanie, ale od czasu opublikowania tych odpowiedzi pojawiło się wiele świetnych bibliotek. Jest to przeznaczone jako rodzaj przewodnika dla początkujących.
Omówię kilka przypadków użycia do wykonywania operacji sieciowych i do roztworu lub dwa dla każdego.
ReST przez HTTP
Zazwyczaj Json może być XML lub czymś innym
Pełny dostęp do interfejsu API
Załóżmy, że piszesz aplikację, która pozwala użytkownikom śledzić ceny akcji, stopy procentowe i kursy walut. Znajdziesz Json API, który wygląda mniej więcej tak:
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)
Modernizacja z Square
Jest to doskonały wybór dla interfejsu API z wieloma punktami końcowymi i pozwala zadeklarować punkty końcowe ReST zamiast kodować je indywidualnie, jak w przypadku innych bibliotek, takich jak ion lub Volley. (strona internetowa: http://square.github.io/retrofit/ )
Jak korzystać z interfejsu API finansów?
build.gradle
Dodaj następujące wiersze do poziomu modułu 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);
}
FinanseApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
Fragment fragmentu finansów
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
}
}
Jeśli Twój interfejs API wymaga wysłania klucza API lub innego nagłówka, takiego jak token użytkownika itp., Retrofit ułatwia to (zobacz tę niesamowitą odpowiedź, aby uzyskać szczegółowe informacje: https://stackoverflow.com/a/42899766/1024412 ).
Jednorazowy dostęp do interfejsu API ReST
Załóżmy, że budujesz aplikację „nastrojowa pogoda”, która sprawdza lokalizację GPS użytkowników, sprawdza aktualną temperaturę w tym obszarze i informuje ich o nastroju. Ten typ aplikacji nie musi deklarować punktów końcowych interfejsu API; po prostu musi mieć dostęp do jednego punktu końcowego interfejsu API.
Jon
To świetna biblioteka dla tego typu dostępu.
Przeczytaj wspaniałą odpowiedź msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Załaduj obrazy przez HTTP
Salwa
Volley może być również użyty dla interfejsów API ReST, ale z powodu bardziej skomplikowanej konfiguracji wolę używać Retrofit z Square jak wyżej ( http://square.github.io/retrofit/ )
Załóżmy, że tworzysz aplikację społecznościową i chcesz załadować zdjęcia profilowe znajomych.
build.gradle
Dodaj tę linię do poziomu modułu buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Siatkówka wymaga większej konfiguracji niż modernizacja. Będziesz musiał stworzyć taką klasę, aby skonfigurować RequestQueue, ImageLoader i ImageCache, ale nie jest tak źle:
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
Dodaj następujące elementy do pliku XML układu, aby dodać obraz:
<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
Dodaj następujący kod do metody onCreate (fragment, działanie) lub konstruktora (okno dialogowe):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Kolejna doskonała biblioteka z Square. Proszę zobaczyć na stronie kilka świetnych przykładów: http://square.github.io/picasso/