На этот вопрос уже есть много отличных ответов, но с тех пор, как эти ответы были опубликованы, появилось много отличных библиотек. Это задумано как своего рода руководство для новичков.
Я расскажу о нескольких вариантах использования для выполнения сетевых операций и по решениям для каждого.
REST over HTTP
Обычно JSON, но это может быть XML или что-то еще.
Full API Access
Допустим, вы пишете приложение, которое позволяет пользователям отслеживать цены на акции, процентные ставки и курсы обмена валют. Вы найдете JSON API, который выглядит примерно так:
http://api.example.com/stocks // ResponseWrapper<String> object containing a
// list of strings 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
Это отличный выбор для API с несколькими конечными точками и позволяет объявлять конечные точки REST вместо того, чтобы кодировать их по отдельности, как с другими библиотеками, такими как Amazon Ion Java или Volley (веб-сайт : Модернизация).
Как вы используете его с финансовым API?
File build.gradle
Добавьте эти строки в файл module level build.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
File 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);
}
Class FinancesApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
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
}
}
Если вашему API требуется отправить ключ API или другой заголовок, например токен пользователя и т. Д., Retrofit упрощает это (см. этот замечательный ответ на Добавить параметр заголовка при модернизации < / em> для подробностей).
One-off REST API access
Предположим, вы создаете приложение с погодой для настроения, которое ищет местоположение пользователя по GPS, проверяет текущую температуру в этой области и сообщает ему настроение. Приложению этого типа не нужно объявлять конечные точки API; ему просто нужно иметь доступ к одной конечной точке API.
Ion
Это отличная библиотека для такого типа доступа.
Прочтите отличный ответ msysmilu на Как исправить 'android.os.NetworkOnMainThreadException'?.
Load images via HTTP
Volley
Volley также можно использовать для REST API, но из-за более сложной настройки я предпочитаю использовать Модернизируйте Square, как указано выше.
Допустим, вы создаете приложение для социальной сети и хотите загрузить фотографии профилей друзей.
File build.gradle
Добавьте эту строку в свой файл module level build.gradle:
implementation 'com.android.volley:volley:1.0.0'
File ImageFetch.java
Volley требует больше настроек, чем модернизация. Вам нужно будет создать такой класс, чтобы настроить 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;
}
}
File 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"/>
File UserViewDialog.java
Добавьте следующий код в метод onCreate (Fragment, Activity) или конструктор (Dialog):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Picasso - еще одна отличная библиотека от Square. Пожалуйста, посетите веб-сайт, чтобы увидеть несколько отличных примеров.
person
KG6ZVP
schedule
20.10.2017