이 질문에는 이미 많은 훌륭한 답변이 있지만 그 답변이 게시 된 이후 많은 훌륭한 도서관이 나왔습니다. 이것은 일종의 초보자 안내서입니다.
내가 네트워크 운영 및 수행에 대한 몇 가지 사용 사례 다룰 것 솔루션 또는 각각 두.
HTTP를 통한 ReST
일반적으로 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)
광장에서 개조
이는 엔드 포인트가 여러 개인 API에 탁월한 선택이며 이온 또는 발리와 같은 다른 라이브러리와 같이 개별적으로 코딩하지 않고 ReST 엔드 포인트를 선언 할 수 있습니다. (웹 사이트 : http://square.github.io/retrofit/ )
Finances 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);
}
재정
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 ).
일회용 ReST API 액세스
사용자 GPS 위치를 조회하고 해당 지역의 현재 온도를 확인하고 분위기를 알려주는 "기상 날씨"앱을 구축한다고 가정 해 보겠습니다. 이 유형의 앱은 API 엔드 포인트를 선언 할 필요가 없습니다. 하나의 API 엔드 포인트에 액세스 할 수 있어야합니다.
이온
이 유형의 액세스를위한 훌륭한 라이브러리입니다.
msysmilu의 위대한 답변을 읽으십시오 ( https://stackoverflow.com/a/28559884/1024412 )
HTTP를 통해 이미지로드
발리
발리는 ReST API에도 사용할 수 있지만 더 복잡한 설정이 필요하기 때문에 위와 같이 Square에서 Retrofit을 사용하는 것을 선호합니다 ( 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) 또는 생성자 (Dialog)에 추가하십시오.
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
피카소
Square의 또 다른 훌륭한 도서관. 좋은 예를 보려면 사이트를 참조하십시오 : http://square.github.io/picasso/