Sudah ada banyak jawaban bagus untuk pertanyaan ini, tetapi banyak perpustakaan hebat telah keluar sejak jawaban-jawaban itu diposting. Ini dimaksudkan sebagai semacam panduan pemula.
Saya akan membahas beberapa kasus penggunaan untuk melakukan operasi jaringan dan satu atau dua solusi untuk masing-masingnya.
REST melalui HTTP
Biasanya Json, bisa berupa XML atau yang lainnya
Akses API Penuh
Katakanlah Anda sedang menulis aplikasi yang memungkinkan pengguna melacak harga saham, suku bunga, dan nilai tukar saat ini. Anda menemukan API Json yang terlihat seperti ini:
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)
Retrofit dari Square
Ini adalah pilihan yang sangat baik untuk API dengan banyak titik akhir dan memungkinkan Anda untuk mendeklarasikan titik akhir REST daripada harus kode mereka secara individual seperti dengan perpustakaan lain seperti ion atau Volley. (situs web: http://square.github.io/retrofit/ )
Bagaimana Anda menggunakannya dengan API keuangan?
build.gradle
Tambahkan baris ini ke buid.gradle tingkat Modul Anda:
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);
}
Pembangun Keuangan
public class FinancesApiBuilder {
public static FinancesApi build(String baseUrl){
return new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(FinancesApi.class);
}
}
Cuplikan Keuangan
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
}
}
Jika API Anda memerlukan Kunci API atau tajuk lainnya seperti token pengguna, dll. Untuk dikirim, Retrofit membuatnya mudah (lihat jawaban yang luar biasa ini untuk detailnya: https://stackoverflow.com/a/42899766/1024412 ).
Sekali lagi akses API REST
Katakanlah Anda sedang membangun aplikasi "mood mood" yang mencari lokasi pengguna GPS dan memeriksa suhu saat ini di area itu dan memberi tahu mereka mood. Jenis aplikasi ini tidak perlu mendeklarasikan titik akhir API; itu hanya perlu dapat mengakses satu titik akhir API.
Ion
Ini adalah perpustakaan yang bagus untuk jenis akses ini.
Silakan baca jawaban hebat msysmilu ( https://stackoverflow.com/a/28559884/1024412 )
Memuat gambar melalui HTTP
Tembakan
Volley juga dapat digunakan untuk API REST, tetapi karena pengaturan yang lebih rumit diperlukan saya lebih suka menggunakan Retrofit dari Square seperti di atas ( http://square.github.io/retrofit/ )
Katakanlah Anda sedang membangun aplikasi jejaring sosial dan ingin memuat foto profil teman.
build.gradle
Tambahkan baris ini ke buid.gradle tingkat Modul Anda:
implementation 'com.android.volley:volley:1.0.0'
ImageFetch.java
Volley membutuhkan lebih banyak pengaturan daripada Retrofit. Anda perlu membuat kelas seperti ini untuk menyiapkan RequestQueue, ImageLoader, dan ImageCache, tapi itu tidak terlalu buruk:
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
Tambahkan berikut ini ke file xml tata letak Anda untuk menambahkan gambar:
<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
Tambahkan kode berikut ke metode onCreate (Fragmen, Aktivitas) atau konstruktor (Dialog):
NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());
Picasso
Perpustakaan lain yang sangat baik dari Square. Silakan lihat situs untuk beberapa contoh bagus: http://square.github.io/picasso/