techiumスマートフォン用の表示で見るtechiumこのブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。いただけますと気が向いたら調査するかもしれません。この広告は、90日以上更新していないブログに表示しています。LibraryAndroidでネットワーク通信するアプリを作る際、少し前まではVolleyを使うのがイケてるAndroiderの嗜みだったようですが、最近ではどうやらRetrofitがその地位を奪いつつあるようです。いうことで遅ればせながらイケてるAndroider目指してRetrofitをお触りしてみます。Retrofitとは導入方法インタフェースを定義するデータクラスを定義するAPI実行Retrofitを設定するAPIをインスタンス化するリクエストを1個ずつインスタンス化するCallを実行するレスポンスを処理する所感サンプルコード参考RetrofitとはRetrofitはSquareが開発しているネットワークアクセスライブラリです。特徴的なのはサーバ側のAPIをインタフェースとして定義することで、API呼び出しの実装とAPI定義を分離しコードの見通しを簡潔に保つことができるという点だと思います。実装とAPI定義が分離しているため、後からAPIを追加することも容易となり保守性の高い設計ができそうです。API部分をインタフェース化することが必須なので、DIと非常に相性が良く容易にモックと差し替えられるので非常にテスタビリティが高いと言えます*1。このあたり今時っぽい感じがします。ちなみに割りと最近バージョンが2.x系になったそうで、1.x系とは書き方が結構違うようなのでGoogle先生に聞く時はどのバージョンの話なのかに注意が必要です。導入はGradleファイルに1行書くだけです。2016/04/10時点での最新バージョンは2.0.1です。'com.squareup.retrofit2:retrofit:2.0.1'ちなみに当然ながらインターネットのパーミッションが必要なのでマニフェストに追加しましょう。android:name="android.permission.INTERNET"/>インタフェースを定義する無事に導入できたら呼び出し対象のAPIインタフェースを定義します。Retrofitの使い方を検索するとなぜかほとんど天気予報APIのサンプルばっかりだったので、今回ははてなAPIを使ってみました。target);}各メソッドはアノテーションでhttpのアクセスメソッドを指定できます。カッコ内はベースURL以降のAPIのURLを指定します。ベースURLはAPIをコールする準備段階でセットしますが、上記の例ではアクセスURLはhttp://b.hatena.ne.jp/entry/jsonlite/?url=(実行時に指定)となります。targetは、引数のtargetをアクセス時のクエリパラメータに付与するという指定です。戻り値のCall<T>で任意の型Tを戻り値に指定できます。RetrofitではCallオブジェクトが1回のAPIコールに対応します。Call<T>.execute()、Call<T>.enqueue(Callback<T>)を実行することで、それぞれ同期・非同期のAPI呼び出しが実行できます。非同期実行の場合はenqueueで指定したコールバックでAPI実行結果をハンドリングできます。データクラスを定義する次にAPI実行後の戻り値を受けるためのデータクラスを定義します。Object)*2なクラスにするとGsonConverterなどでサクッと変換してくれるようなので今回はその方向で行きます。jsonschema2pojoというサイトでJSONオブジェクトからPOJOなオブジェクトを作成できるので、変換してクラスを追加します。別にレスポンスがJSONじゃなくてもいいみたいですが、XMLとかを扱おうとするとConverterを自作して自分でパースするとかいうめんどくさい作業が必要っぽいので今回はJSONでレスポンスを返してくれるAPIを使います。今回はデータクラスとして以下のクラスを作成しました。略}POJOなクラスなのでメンバとセッタ/ゲッタがあるだけの単純なものです。注意点としては各メンバに@Exposeアノテーションを付けないとAPI実行時にGsonConverterで処理できないというようなエラーが出てアプリが落ちます。原因はよくわかりませんでしたがGsonを使う人にとってはアノテーション付けるのが常識?なんでしょうか。API実行ここまででAPI実行の準備ができたので実際にAPI呼び出し部分を作ってみます。基本的な流れは以下のようになります。Retrofitを設定するAPIをインスタンス化するリクエストを1個ずつインスタンス化する(Callクラス)Callを実行するレスポンスを処理する以下で1つずつ見ていきます。Retrofitを設定するRetrofit.Builderを通してRetrofitインスタンスを作成します。baseUrlでベースURLを指定しaddConverterFactoryでレスポンスを処理するConverterを指定します。他にも色々あるみたいですがとりあえず今回はこれだけ。.build();ちなみにRetrofit1.9まではGsonConverterはRetrofitに内蔵されてたそうですが、2.0からは分けられているらしいので使う場合は手動で追加してやる必要があります。Gradleファイルに以下を追加しましょう。'com.google.code.gson:gson:2.6.2'APIをインスタンス化する上記で作成したRetrofitインスタンスから呼び出し対象のAPIをインスタンス化します。ここで呼び出し対象クラスを指定する時に、本番用と同じインタフェースを実装したテストクラスを指定することで、実行インスタンスの差し替えが容易に行なえます。retrofit.create(HatenaApiInterface.class);リクエストを1個ずつインスタンス化する作成したAPIインスタンスのメソッドを実行すると、API実行クラスがインスタンス化されます。この時点ではまだ実際のAPIコールは実行されません。service.getBookmarksWithUrl(HatenaApiInterface.TARGET_URL);Callを実行するCallは同期/非同期のどちらでも実行できます。今回は非同期で実行してみます。引数のCallback<BookmarkContainer>でレスポンスを処理します。略}レスポンスを処理するリクエスト成功時にはonResponse、失敗時にはonFailureが実行されます。onResponseのResponseクラスにレスポンスが入っていてresponse.body()で指定したConverterで変換した結果(ここではBookmarkContainer)が取得できます。後は煮るなり焼くなり好きにしましょう。今回ははてなブックマークのテクノロジーカテゴリトップについているブックマークのコメントをListViewに表示するという特に意味のないアプリです。}});アプリ起動後はこんな感じになります。無事にリストが表示されていれば万事オッケーです。おめでとうございます。触ってみたので実行するまでの流れとかレスポンスの処理とかがイマイチつかめず色々とハマった感は否めないが、一度慣れてしまえばコードの見通しも良いしテスタビリティも非常に高そうなのでかなり扱いやすそうな感じがした。現在は1.x系から2.x系の過渡期かつ日本語情報もまだまだ不足している(特に応用的なことはほとんど見つからない)感じ。後JSONを扱うにはすごい便利だけどRSSのフィード処理したいとかXML使いたいとかなると結構大変そう*3サンプルコードサンプル置いておきますね。Firebase2017-11-23BottomNavigationViewのテストAndroidはてなブログをはじめよう!kobashin__Gさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。