Retrofit2.0とRxJavaを用いた非同期通信　kotlin編！

備忘録的に。
なんでもいいからコードをよこせという場合は[github](https://github.com/SasakiYuki/RxRetrofit)にあげてあります。

# Retrofit2.0
2.0になっていくつか変更があったのでそれに合わせて記述を変更していきます。
まずはGradle周りから。

```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を継承していても問題なく動くのでヒジョーに便利ですね★（今回は用いてません）
特別なことはありませんが一つだけアノテーションを紹介します。

```kotlin
        @SerializedName("hage")
        val hoge:Int
```
をつけてあげることでJsonDataは「hage」になっているが別の名前に変更してあげることができます。

```kotlin
data class  HogeEntity (
        val hoge:Int,
        val fuga:Int,
        val piyo:Int
)
```

# APIクラスの用意
次にinterfaceを用意します。

```kotlin
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でしょうか。

# 実際に呼び出し
実際に呼び出してみましょう。

```kotlin
    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な処理が書けるわけですね～

では呼び出し部を。

```kotlin
    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に関しては解説しませんが[ココ](http://qiita.com/Yuki_Yamada/items/a0855189988539c18b8f)に基本的なことを書いておいたので勉強してからだとよりわかると思います。


以上です。