Takahiro Octopress Blog

-1から始める情弱プログラミング

Kotlinを使ってみよう!(2) : OkHttp編

今回のKotlinのお題は?

さて、久々にKotlinについて勉強をしたいと思います。
今回のお題はAndroid StudioでOkHttp3.0.1を使おう!にしたいと思います。
では、早速見ていきましょう!

KotlinでOkHttp3.0.1を使うソースを書いてみる

まずは、OkHttp3.0.1を使ったソースを書いてみます。
OkHttpの導入はJavaと同じです。

build.gradle(app)に下記を追加しましょう。

1
2
3
4
dependencies {
  ...
  compile 'com.squareup.okhttp3:okhttp:3.0.1'
}

Javaで紹介したときと同様に、Open Weather Map APIを使ったGETリクエストを利用します。
OkHttpでは通信処理をメインスレッドで実行しようとするとエラーが発生してしまうので、AsyncTaskを利用します。
AsyncTaskを継承したクラスを書きます。

1
2
3
4
5
6
7
8
9
10
package com.example.takahiro.simpleapplication

import android.os.AsyncTask

open class MyAsyncTask : AsyncTask<Void, Void, String>() {
  
  override fun doInBackground(vararg params: Void): String? {
      return null
  }
}

ここでKotlinの書き方を説明しましょう。

  • open
    • 他のクラスからの継承を許可するアノテーション
    • MainActivitydoInBackgroundメソッドをオーバーライドするために設定
       
  • vararg
    • 可変長にしたい引数の名前に設定
    • donInBackgroundは引数が1つ以上設定可能な可変長なものを持つため利用

続いて、MainActivityを書いていきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.example.takahiro.simpleapplication

import android.os.AsyncTask
...
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response

class MainActivity:AppCompatActivity() {
  
  internal var client = OkHttpClient()
  
  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      val toolbar = findViewById(R.id.toolbar) as Toolbar
      setSupportActionBar(toolbar)

      <省略>
      
      // GET Weatherボタンを取得して、クリック処理を実装
      val btn = findViewById(R.id.button) as Button
      btn.setOnClickListener {
          object: MyAsyncTask() {
              override fun doInBackground(vararg params: Void): String {
                  var res: String = ""
                  try {
                      res = run("http://api.openweathermap.org/data/2.5/weather?APPID=<自身のAPPID>&q=Tokyo")
                      val resJson = JsonObject(res)
                      val weathers = resJson.getJSONArray("weather")
                      val weather = weathers.getJsonObject(0)
                      val description = weather.getString("description")
                      Log.i("MainActivity", description)
                      res = description
                  } catch(e: IOException) {
                      e.printStackTrace()
                  } catch(e: JSONException) {
                      e.printStackTrace()
                  }
              }
          }.execute()
      }
  }
  
  fun run(url: String): String {
      val request = Request.Builder().url(url).build()

      val response = client.newCall(request).execute()
      return response.body().string()
  }
}

ここでもKotlinの書き方を説明します。

  • object
    • 匿名サブクラスのインスタンスの返却式
    • setOnClickListenerの引数にMyAsyncTaskを匿名クラスとして指定するために利用
    • Kotlinではインスタンス生成にnewは利用しない

さて、いかがでしたでしょうか?
KotlinはSwiftに近い書式で書けるため、筆者にとっては非常にわかりやすいです。
ただ、Javaとの互換性が非常に高いため、やはりそれなりに覚えなくてはならないことがありますね。

これからも少しずつではありますが、Kotlinを見ていきたいと思います。
といったところで本日はここまで。

Comments