LoginSignup
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-18

備忘録的に。
なんでもいいからコードをよこせという場合は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に関しては解説しませんがココに基本的なことを書いておいたので勉強してからだとよりわかると思います。

以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16