Bu soruda zaten birçok harika cevap var, ancak bu cevaplar gönderildiği için birçok harika kütüphane ortaya çıktı. Bu bir tür acemi rehber olarak tasarlanmıştır.
Ağ işlemlerini gerçekleştirmek için birkaç kullanım durumunu ve her biri için bir veya iki çözümü ele alacağım .
HTTP üzerinden ReST
Genellikle Json, XML veya başka bir şey olabilir
Tam API Erişimi
Kullanıcıların hisse senedi fiyatlarını, faiz oranlarını ve cari döviz kurlarını takip etmesini sağlayan bir uygulama yazdığınızı varsayalım. Şuna benzer bir Json API'sı bulursunuz:
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'den sonradan yükseltme
Bu, birden fazla uç noktaya sahip bir API için mükemmel bir seçimdir ve iyon veya Volley gibi diğer kütüphanelerde olduğu gibi bunları ayrı ayrı kodlamak yerine ReST uç noktalarını bildirmenizi sağlar. (web sitesi: http://square.github.io/retrofit/ )
Finans API'sı ile nasıl kullanıyorsunuz?
build.gradle
Bu satırları Modül düzeyi buid.gradle'a ekleyin:
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);
}
}
Parça pasajı
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'nizin gönderilmesi için bir API Anahtarı veya kullanıcı belirteci gibi başka bir başlık vb. Gerekiyorsa, Retrofit bunu kolaylaştırır (ayrıntılar için bu müthiş cevaba bakın: https://stackoverflow.com/a/42899766/1024412 ).
Bir kerelik ReST API erişimi
Kullanıcıların GPS konumunu arayan ve o bölgedeki mevcut sıcaklığı kontrol eden ve onlara havayı anlatan bir "hava durumu hava durumu" uygulaması oluşturduğunuzu varsayalım. Bu tür bir uygulamanın API uç noktalarını bildirmesine gerek yoktur; yalnızca bir API uç noktasına erişebilmesi gerekir.
İyon
Bu, bu tür bir erişim için harika bir kütüphanedir.
Lütfen msysmilu'nun harika cevabını okuyun ( https://stackoverflow.com/a/28559884/1024412 )
HTTP üzerinden resim yükleme
Volley
Volley, ReST API'leri için de kullanılabilir, ancak daha karmaşık kurulum nedeniyle, Retrofit'i yukarıdaki gibi kullanmayı tercih ederim ( http://square.github.io/retrofit/ )
Bir sosyal ağ uygulaması oluşturduğunuzu ve arkadaşlarınızın profil resimlerini yüklemek istediğinizi varsayalım.
build.gradle
Bu satırı Modül düzeyinize ekleyin buid.gradle:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Volley, Retrofit'ten daha fazla kurulum gerektirir. Bir RequestQueue, bir ImageLoader ve bir ImageCache kurmak için böyle bir sınıf oluşturmanız gerekir, ancak bu çok kötü değil:
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
Resim eklemek için düzen xml dosyanıza aşağıdakileri ekleyin:
<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 yöntemine (Fragment, Activity) veya yapıcıya (Dialog) aşağıdaki kodu ekleyin:
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Square'den bir başka mükemmel kütüphane. Bazı harika örnekler için lütfen siteye bakın: http://square.github.io/picasso/