Es gibt bereits viele großartige Antworten auf diese Frage, aber seit diese Antworten veröffentlicht wurden, sind viele großartige Bibliotheken herausgekommen. Dies ist als eine Art Newbie-Guide gedacht.
Ich werde mehrere Anwendungsfälle für die Durchführung von Netzwerkoperationen und jeweils eine oder zwei Lösungen behandeln.
ReST über HTTP
Typischerweise kann Json XML oder etwas anderes sein
Voller API-Zugriff
Angenommen, Sie schreiben eine App, mit der Benutzer Aktienkurse, Zinssätze und Wechselkurse verfolgen können. Sie finden eine Json-API, die ungefähr so aussieht:
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)
Nachrüstung vom Platz
Dies ist eine ausgezeichnete Wahl für eine API mit mehreren Endpunkten und ermöglicht es Ihnen, die ReST-Endpunkte zu deklarieren, anstatt sie wie bei anderen Bibliotheken wie ion oder Volley einzeln codieren zu müssen. (Website: http://square.github.io/retrofit/ )
Wie verwenden Sie es mit der Finanz-API?
build.gradle
Fügen Sie diese Zeilen zu Ihrer Modulebene hinzu 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);
}
}
FinancesFragment-Snippet
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
}
}
Wenn für Ihre API ein API-Schlüssel oder ein anderer Header wie ein Benutzertoken usw. gesendet werden muss, macht Retrofit dies einfach (Einzelheiten finden Sie in dieser fantastischen Antwort: https://stackoverflow.com/a/42899766/1024412 ).
Einmaliger ReST-API-Zugriff
Angenommen, Sie erstellen eine "Stimmungswetter" -App, die den GPS-Standort des Benutzers abruft, die aktuelle Temperatur in diesem Bereich überprüft und ihm die Stimmung mitteilt. Diese Art von App muss keine API-Endpunkte deklarieren. Es muss nur auf einen API-Endpunkt zugreifen können.
Ion
Dies ist eine großartige Bibliothek für diese Art des Zugriffs.
Bitte lesen Sie die großartige Antwort von msysmilu ( https://stackoverflow.com/a/28559884/1024412 ).
Laden Sie Bilder über HTTP
Volley
Volley kann auch für ReST-APIs verwendet werden. Aufgrund der komplizierteren Einrichtung bevorzuge ich jedoch die Nachrüstung von Square wie oben ( http://square.github.io/retrofit/ ).
Angenommen, Sie erstellen eine Social-Networking-App und möchten Profilbilder von Freunden laden.
build.gradle
Fügen Sie diese Zeile Ihrer Modulebene hinzu buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Volley erfordert mehr Setup als Nachrüstung. Sie müssen eine Klasse wie diese erstellen, um eine RequestQueue, einen ImageLoader und einen ImageCache einzurichten, aber es ist nicht schlecht:
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
Fügen Sie Ihrer XML-Layoutdatei Folgendes hinzu, um ein Bild hinzuzufügen:
<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
Fügen Sie der onCreate-Methode (Fragment, Activity) oder dem Konstruktor (Dialog) den folgenden Code hinzu:
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Eine weitere ausgezeichnete Bibliothek von Square. Auf der Website finden Sie einige gute Beispiele: http://square.github.io/picasso/