備忘録的に。
なんでもいいからコードをよこせという場合はgithubにあげてあります。
Retrofit2.0
2.0になっていくつか変更があったのでそれに合わせて記述を変更していきます。
まずはGradle周りから。
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
Rx系とretrofit本体、そしてconverterにgsonconverterを用いるのでそれとcallAdapterにrxJavaAdapterを用いるのでそれらをcompileします。
データクラスの作成
まずデータクラスを作成します。
知らなかったんですけどrealmObjectを継承していても問題なく動くのでヒジョーに便利ですね★(今回は用いてません)
特別なことはありませんが一つだけアノテーションを紹介します。
@SerializedName("hage")
val hoge:Int
をつけてあげることでJsonDataは「hage」になっているが別の名前に変更してあげることができます。
data class HogeEntity (
val hoge:Int,
val fuga:Int,
val piyo:Int
)
APIクラスの用意
次にinterfaceを用意します。
interface HogeApi {
@Headers("Content-Type: application/json")
@POST("/api/users/create")
fun createUser(@Body sJson:String):Observable<HogeEntity>
}
JSON形式のデータをPOSTしたい場合はHeaderにcontentTypeをしないといけませんね。@Headersアノテーションを使ってセットしてください。当たり前ですがstreamデータ等を用いたい場合はそこを変えればいいわけです。あ、[s]を忘れないでくださいね。@Headersです。
次にPOSTアノテーションですがこれも臨機応変にGET PUT DELETE等に変更してください。
POSTしたいデータは@Bodyの中に渡してください。
あとよく用いるのはqueryでしょうか。
実際に呼び出し
実際に呼び出してみましょう。
private val restClient:Retrofit
get() = Retrofit.Builder().client(getClient()).baseUrl(ENDPOINT).addConverterFactory(GsonConverterFactory.create(Gson())).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build()
private fun getClient():OkHttpClient{
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
return OkHttpClient.Builder().addInterceptor(interceptor).build()
}
companion object{
private val ENDPOINT = "http://www.kanazawa-arts.or.jp/"
private val TAG = MainActivity.javaClass.simpleName
}
2.0以前とはだいぶ書き方が変わっていますが、かなりすっきりしましたね。
getClientのほうでLogに出力する箇所を定義しています。Level.BODYを[HEADERS]や[BASIC]もしくは[NONE]にすることで簡単に変更できます。
addConverterFactoryは私はGsonでパースしていますがmoshiなどでもできると思います。
CallAdapterはRxJavaCallAdapterを使用します。これをすることでRxな処理が書けるわけですね~
では呼び出し部を。
private fun startApi(){
val api = getRestClient().create(HogeApi::class.java)
api.createUser()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Subscriber<HogeEntity>(){
override fun onCompleted() {
Log.d(TAG, "onCompleted")
}
override fun onError(p0: Throwable?) {
p0!!.printStackTrace()
Log.d(TAG, "error")
}
override fun onNext(p0: HogeEntity?) {
Log.d(TAG,p0!!.hoge.toString())
}
})
}
createUserはObservableが返ってくるのでそれに対してsubscribeは新しいスレッドで、observeはメインスレッドで、ということを明示してあげてsubscribeは無名クラスで宣言しておきます。
OnNextの中でviewに対してアクションをしてあげるといいでしょう。
Rxjavaに関しては解説しませんがココに基本的なことを書いておいたので勉強してからだとよりわかると思います。
以上です。