На этот вопрос уже есть много хороших ответов, но с тех пор, как эти ответы были опубликованы, появилось много замечательных библиотек.Это задумано как своего рода руководство для новичка.
Я рассмотрю несколько вариантов использования для выполнения сетевых операций и a решение или два для каждого.
ReST через HTTP
Обычно Json, может быть XML или что-то еще
Полный доступ к API
Допустим, вы пишете приложение, которое позволяет пользователям отслеживать цены на акции,процентные ставки и курсы валют.Вы найдете Json API, который выглядит примерно так:
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)
Модернизация от Square
Это отличный выбор для API с несколькими конечными точками, позволяющий объявлять конечные точки ReST вместонеобходимость кодировать их индивидуально, как с другими библиотеками, такими как Ион или Волей.(веб-сайт: 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);
}
FinancesApiBuilder
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
Фрагмент фрагмента FinancesFragment
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.
Ion
Это отличная библиотека для этого типаaccess.
Пожалуйста, прочитайте отличный ответ msysmilu (https://stackoverflow.com/a/28559884/1024412)
Загрузка изображений по HTTP
Volley
Залп может также использоваться для API ReST, но из-за более сложной настройки я предпочитаю использовать Retrofit from Square, как указано выше (http://square.github.io/retrofit/)
Допустим, вы строитеприложение социальной сети и хотите загрузить фотографии профиля друзей.
build.gradle
Добавьте эту строку на уровень вашего модуля buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Залп требует больше настроек, чем модификация.Вам нужно создать такой класс, чтобы настроить 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 (Fragment, Activity)или конструктор (Диалог):
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/