На це питання вже є багато чудових відповідей, але з моменту опублікування цих відповідей вийшло багато чудових бібліотек. Це задумано як своєрідний посібник для новачків.
Я охоплювати кілька варіантів використання для виконання мережевих операцій і в розчині , або два для кожного з них.
Відпочинок через HTTP
Зазвичай Json, це може бути XML або щось інше
Повний доступ до API
Скажімо, ви пишете додаток, який дозволяє користувачам відстежувати ціни акцій, процентні ставки та курси валют. Ви знаходите API Json, який виглядає приблизно так:
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)
Модернізація з площі
Це відмінний вибір для API з декількома кінцевими точками і дозволяє оголошувати кінцеві точки ReST, замість того, щоб кодувати їх окремо, як для інших бібліотек, таких як ion або Volley. (веб-сайт: http://square.github.io/retrofit/ )
Як ви використовуєте це з API фінансів?
build.gradle
Додайте ці рядки до свого рівня модуля 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);
}
ФінансиApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
Фрагмент фрагмента фінансів
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
}
}
Якщо ваш API вимагає надіслати ключ API або інший заголовок, наприклад маркер користувача тощо, Retrofit робить це легко (детальніше див. Цю чудову відповідь: https://stackoverflow.com/a/42899766/1024412 ).
Разовий доступ до API ReST
Скажімо, ви створюєте додаток "погода настрій", який шукає місцезнаходження користувачів GPS і перевіряє поточну температуру в цій області та повідомляє їм про настрій. Для цього типу додатків не потрібно оголошувати кінцеві точки API; просто потрібно мати доступ до однієї кінцевої точки API.
Іон
Це чудова бібліотека для такого типу доступу.
Прочитайте чудову відповідь msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Завантажте зображення через HTTP
Воллей
Залп можна також використовувати для API ReST, але через складніші необхідні настройки я вважаю за краще використовувати Retrofit з квадрата, як зазначено вище ( http://square.github.io/retrofit/ )
Скажімо, ви створюєте додаток для соціальних мереж і хочете завантажити фотографії профілю друзів.
build.gradle
Додайте цей рядок до свого рівня модуля buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Воллі вимагає більше налаштувань, ніж Retrofit. Вам потрібно буде створити такий клас, щоб встановити RequestQueue, ImageLoader та ImageCache, але це не дуже погано:
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
Додайте зображення до файлу xml-файлу, щоб додати зображення:
<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
Додайте наступний код до методу onCreate (Фрагмент, Діяльність) або конструктора (Діалог):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Пікассо
Ще одна відмінна бібліотека від пл. Перегляньте на сайті кілька чудових прикладів: http://square.github.io/picasso/