この質問にはすでに多くの素晴らしい答えがありますが、それらの答えが投稿されて以来、多くの素晴らしい図書館が出てきました。これは一種の初心者ガイドとして意図されています。
ネットワーク操作を実行するためのいくつかのユースケースと、それぞれに1つか2つのソリューションについて説明します。
通常はJSONですが、XMLなどの場合もあります。
フルAPIアクセス
ユーザーが株価、金利、為替レートを追跡できるアプリを作成しているとします。次のようなJSONAPIが見つかります。
http://api.example.com/stocks // ResponseWrapper<String> object containing a
// list of strings 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に最適であり、Amazon Ion JavaやVolley(Webサイト:Retrofit)などの他のライブラリのように個別にコーディングする代わりに、RESTエンドポイントを宣言できます。
財務APIでどのように使用しますか?
ファイルbuild.gradle
次の行をモジュールレベルのbuild.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を使用するとこれが簡単になります(詳細については、Retrofitにヘッダーパラメーターを追加するためのこのすばらしい回答を参照してください)。
1回限りのRESTAPIアクセス
ユーザーのGPS位置を検索し、その地域の現在の気温をチェックして気分を知らせる「気分天気」アプリを作成しているとします。このタイプのアプリは、APIエンドポイントを宣言する必要はありません。1つのAPIエンドポイントにアクセスできる必要があります。
イオン
これは、このタイプのアクセスに最適なライブラリです。
「android.os.NetworkOnMainThreadException」を修正するにはどうすればよいですか?に対するmsysmiluのすばらしい回答をお読みください。。
HTTP経由で画像を読み込む
ボレー
VolleyはRESTAPIにも使用できますが、セットアップがより複雑になるため、上記のようにSquareのRetrofitを使用することをお勧めします。
ソーシャルネットワーキングアプリを作成していて、友達のプロフィール写真を読み込みたいとします。
ファイルbuild.gradle
次の行をモジュールレベルのbuild.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());
ピカソ
Picassoは、Squareのもう1つの優れたライブラリです。いくつかの素晴らしい例については、Webサイトを参照してください。