На этот вопрос уже много замечательных ответов, но с тех пор, как эти ответы были опубликованы, появилось много замечательных библиотек.
Я рассмотрю несколько вариантов использования сетевых операций и a решение или два для каждого.
Обычно Json может быть XML или что-то еще
Предположим, вы пишете приложение что позволяет пользователям отслеживать цены акций, процентные ставки и курсы обмена валют. Вы найдете Json API, который выглядит примерно так:
http://api.example.com/stocks //ResponseWrapper 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 object
http://api.example.com/currencies //ResponseWrapper object containing a list of currency abbreviation
http://api.example.com/currencies/$currency //Currency object
http://api.example.com/currencies/$id1/values/$id2 //PriceHistory object comparing the prices of the first currency (id1) to the second (id2)
Это отличный выбор для 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> listStocks();
@GET("stocks/{symbol}")
Call getStock(@Path("symbol")String tickerSymbol);
@GET("stocks/{symbol}/prices")
Call> getPriceHistory(@Path("symbol")String tickerSymbol);
@GET("currencies")
Call> listCurrencies();
@GET("currencies/{symbol}")
Call getCurrency(@Path("symbol")String currencySymbol);
@GET("currencies/{symbol}/values/{compare_symbol}")
Call> 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(){
@Override
public void onResponse(Call stockCall, Response stockResponse){
Stock stock = stockCall.body();
//do something with the stock
}
@Override
public void onResponse(Call stockCall, Throwable t){
//something bad happened
}
}
Если ваш API требует, чтобы API-ключ или другой заголовок, такой как токен пользователя и т. д., отправлялся, Retrofit делает это проще (см. этот удивительный ответ для деталей: https://stackoverflow.com/a/42899766/1024412 ).
Предположим, вы создавая приложение «погода настроения», которое просматривает местоположение GPS-пользователей и проверяет текущую температуру в этой области и сообщает им настроение. Для этого типа приложения не требуется объявлять конечные точки API; он просто должен иметь доступ к одной конечной точке API.
Это отличная библиотека для этого типа доступа.
Пожалуйста, прочитайте отличный ответ msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Volley также может использоваться для API-интерфейсов ReST, но из-за более сложной настройки я предпочитаю использовать Retrofit from Square, как указано выше ( http://square.github.io/retrofit/ )
Предположим, вы создаете приложение для социальных сетей и хотите загружать фотографии друзей друзей.
build.gradle
Добавьте эту строку в свой модуль level 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 cache = new HashMap();
@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-файл макета для добавления изображения:
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/
Как вы можете видеть, оператор AND оставляет каждую строку, в которой по крайней мере одно значение равно -1. С другой стороны, оператор OR требует, чтобы оба значения были равны -1, чтобы отбросить их.
blockquote>Правильно. Помните, что вы пишете условие с точки зрения того, что вы хотите сохранить , а не с точки зрения того, что вы хотите сбросить. Для
df1
:df1 = df[(df.a != -1) & (df.b != -1)]
Вы говорите: «Сохраните строки, в которых
df.a
не является -1, аdf.b
не равно -1», что равнозначно удалению каждая строка, в которой хотя бы одно значение равно -1.Для
df2
:df2 = df[(df.a != -1) | (df.b != -1)]
Вы говорите: «Сохраните строки, в которых либо
df.a
, либоdf.b
не равно -1 ", что совпадает с удалением строк, где оба значения равны -1.PS: скованный доступ, такой как
df['a'][1] = -1
, может вызвать у вас проблемы. Лучше привыкнуть к использованию.loc
и.iloc
.
Вы можете использовать query () , т. е .:
df_filtered = df.query('a == 4 & b != 2')