Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@yukiyamadajp

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

More than 3 years have passed since last update.

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

以上です。

16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yukiyamadajp
Androidを書いてます

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?